什么是java:comp / env范围规则?

时间:2015-05-13 08:53:43

标签: java

我理解java:comp/env是JNDI树中的节点,您可以在其中找到当前Java EE组件(Web应用程序或EJB)的属性,而且我知道每个EJB都有自己的组件环境,还有java:globaljava:app以及java:module,具体取决于我有一些问题

  1. 当我使用Context envContext = (Context)initContext.lookup("java:comp/env");来获取initContext时我得到的上下文(全局,应用,模块,webApp或EJB上下文)?
  2. 是否有适用于搜索不同范围的规则?
  3. 假设我有许多EJB的Web应用程序,这是否意味着我有许多初始上下文(一个用于webApp,一个用于每个EJB),或者所有这些资源都以某种方式收集在一个上下文java:comp/env下? / LI>

    非常感谢。

4 个答案:

答案 0 :(得分:1)

  1. 当我使用Context envContext =(Context)initContext.lookup(" java:comp / env");获取initContext我得到的上下文(全局,应用程序,模块,webApp或EJB上下文)?
  2. 引用TomEE文档http://tomee.apache.org/lookup-of-other-ejbs-example.html

      

    在webapp中,java:comp / env命名空间由所有servlet共享。   这基本上等同于Java EE中的java:module命名空间   6.理解这里的定义存在冲突,对于EJB,java:comp的作用域是组件(EJB本身)而不是   与webapps一样的模块。

    1. 是否有适用于搜索不同范围的规则?
    2. 引用JavaEE 6教程http://docs.oracle.com/cd/E19798-01/821-1841/girgn/index.html

        

      java:global JNDI命名空间是查找远程的可移植方式   使用JNDI查找的企业bean。使用java:module命名空间   在同一模块中查找本地企业bean。该   java:app namespace用于查找打包的本地企业bean   在同一个应用程序中。也就是说,企业bean是打包的   在包含多个Java EE模块的EAR文件中。

      1. 假设我有许多EJB的Web应用程序,这是否意味着我有许多初始上下文(一个用于webApp,一个用于每个EJB),或者所有这些资源都以某种方式收集在一个上下文中:java:comp / env的?
      2.   

        根据以上链接,您将没有很多背景。

答案 1 :(得分:1)

关于存在EJB的java:comp/env范围的问题3。

传统上(在JEE 6之前)java:comp/envwar模块的模块级别和jar模块中EJB的EJB级别。 在该模型中,必须定义环境条目(通过resource-ref中的env-entryejb-jar.xml,或者资源引用,因为JEE5可以在类级别使用@Resource对于每一个EJB。

<ejb-jar>
  <enterprise-beans>
    <session>
      <ejb-name>B1</ejb-name>
      <ejb-class>p1.B1</ejb-class> <!-- ejb-class should be skipped if bean is already defined via annotation -->
      <env-entry>
        <env-entry-name>entry1</env-entry-name>        
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>value1</env-entry-value
      </env-entry>
    </session>
  </enterprise-beans>
</ejb-jar>

从JEE 6开始,可以将EJB部署为war模块的一部分。无论war模块是直接部署还是部分或ear模块,它都在所有servlet,EJB和该模块中的任何其他代码之间共享一个java:comp/env命名空间。可以在web.xml中定义环境条目:

<web-app>
  <env-entry>
    <env-entry-name>entry1</env-entry-name>        
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>value1</env-entry-value
  </env-entry>
</web-app>

在这个基于war的模型中,人们仍然可以ejb-jar.xml来配置EJB的其他方面,但env-entry中给定bean的ejb-jar.xml最终会注入war中所有其他bean的环境值。

因此,我总是会将war档案用于所有内容(可能打包在ear中)。

答案 2 :(得分:0)

  
      
  1. 当我使用Context envContext =(Context)initContext.lookup(“java:comp / env”);获取initContext我得到的上下文(全局,应用程序,模块,webApp或EJB上下文)?
  2.   

您得到了您要求的那个,您正确描述为'当前Java EE组件(Web应用程序或EJB)的那个。

  
      
  1. 是否有适用于搜索不同范围的规则?
  2.   

您在指定的范围内搜索。我不知道你的问题还有什么意思。

  
      
  1. 假设我有许多EJB的Web应用程序,这是否意味着我有许多初始上下文(一个用于webApp,一个用于每个EJB),或者所有这些资源都以某种方式收集在一个上下文java:comp / env?< / LI>   

这个问题没有意义。您创建的InitialContextsInitialContext。它们是物体。 他们所指的取决于您在中查找 "the current Java EE component (a webapp, or an EJB)"的内容。如果你一直在查找java:comp/env,你会一直这样做。所有“这些资源”分别以自己的名义“收集”, .icon-delete { background-image: url(../images/delete.png) !important; } 内。

答案 3 :(得分:0)

据我所知,默认情况下,范围将为全球