Java @EJBs注释做什么?

Java @EJBs注释做什么?,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我大致知道这个构造的作用:它创建一个sometypejb并将对象注入另一个EJB @EJB(name="name1") SomeType someVariable 现在我有一个这样开始的类:(我给出了所有类级别的注释,尽管我认为只有@ejb是相关的) @EJBs在这里做什么?他们可能会获得或创建“名称1”。。。对象,但它们将结果放在哪里?我在附近没有看到.lookup调用,但是代码库很大,所以我对此不是很确定 附加问题:我假设两个@Transaction注释只是重复默认值 更新:此时有多人

我大致知道这个构造的作用:它创建一个sometypejb并将对象注入另一个EJB

 @EJB(name="name1")
 SomeType someVariable
现在我有一个这样开始的类:(我给出了所有类级别的注释,尽管我认为只有
@ejb
是相关的)

@EJB
s在这里做什么?他们可能会获得或创建“名称1”。。。对象,但它们将结果放在哪里?我在附近没有看到
.lookup
调用,但是代码库很大,所以我对此不是很确定

附加问题:我假设两个
@Transaction
注释只是重复默认值

更新:此时有多人声称
@EJBs
是专有扩展。事实并非如此。它是JavaEE5的核心部分。看见它只是单个
@EJB
注释的容器


我相信所有声称这些EJB注释的人都会进行查找。我只想知道这个查找的结果会发生什么。

根据这一点,基本上这个注释使EJB能够相对于其上下文查找外部EJB。通常,有更优雅的方法可以做到这一点。

米尔扬·米基奇的回答让我对可能的答案有了一个想法。如果任何了解JNDI的人读到了这篇文章,请告诉我这是否合理,因为我在这里基本上是在猜测

基本上,有两种方法可以查看JNDI树:通过全局路径(/some/propertial/path/my/bean)和程序环境(java:comp/env/my/bean)。其思想是创建从全局路径到本地环境的引用,然后从中查找组件

因此@Ejb(name=“java:comp/env/my/bean”,mappedName=“/some/property/path/my/bean”)将从java代码(没有描述符xml文件)创建此引用


这意味着@Ejb(name=“java:comp/env/my/bean”)本身是一个no-op:它将引用复制到自身。这可能有一个副作用,即您的应用程序服务器现在在编译时知道需要此引用,但仅此而已。
EJB
注释(以及
@Resource
@webservicef
等)有两个用途:

  • 它在组件名称空间中声明引用。例如,
    @EJB(name=“myEJB”)
    创建一个引用
    java:comp/env/myEJB
    。如果您注释了一个字段而没有指定名称,那么它将创建一个引用
    java:comp/env/com.example.MyClass/myField
  • 如果注释是在字段或setter方法上声明的,则容器在创建组件时执行注入
  • 解析引用的方式各不相同,这与解析引用是为了
    查找(“java:comp/env/myEJB”)
    还是由于注入无关:

  • 如果使用EE 6+,则
    lookup
    属性需要JNDI查找来解析目标
  • 某些应用程序服务器支持指定为特定于供应商的
    mappedName
    。这通常通过执行查找来实现
  • 应用服务器在部署时支持绑定。这通常通过执行查找来实现
  • 如果没有提供其他绑定信息,并且bean接口(
    beanInterface
    或字段类型)仅由应用程序中的单个EJB实现,那么EJB规范要求它返回到该类型
  • 如果未提供其他绑定信息且#4无法工作,则某些应用程序服务器将尝试根据ref名称在服务器命名空间中执行查找(例如,
    java:comp/env/myEJB
    可能导致在服务器命名空间中查找
    myEJB

  • 至于额外的问题:是的,关于事务的两个注释都是重复的默认值:默认的TransactionManagementType是CONTAINER(vs BEAN),而-default-TransactionAttributeType REQUIRED只是声明如果在事务上下文中调用BEAN,则事务将继续,否则将启动一个新事务(与此相反,例如,Required_new将始终创建一个新的tx)。事实上,这并不像听起来那么琐碎。参见EJB3.1规范:

    “13.3.7 Bean方法的事务属性规范

    具有容器管理事务划分的企业Bean的Bean提供者可以指定 企业bean方法的事务属性。默认情况下,事务的值 具有容器管理的事务划分的bean的方法的属性是必需的
    事务属性,并且在本例中不需要显式指定事务属性。[…]”“

    这很奇怪,我从来没有听说过
    @ejb
    ,像这样的Usage.EJBs是Java EE5标准的一部分。请参见此处的javadoc作为证明。这个javadoc非常清楚:它只是收集了多个EJB注释。我认为您说这些EJB查找是正确的。我的问题的主要部分是:这个查找的结果存储在哪里?谢谢你指出这一点,我不知道这包括在标准答案更新中。我有一个web项目,jee 6,其中包含EJB,我不必用@EJB指定名称属性,一旦我将EJB移动到单独的EJB jar(仍然是同一个ear)weblogic 12.1.2告诉我“ejb引用没有ejb链接,并且未指定目标Bean的JNDI名称”
    @Remote(SomeClass.class)
    @Stateless(name="someName")
    @EJBs({@EJB(name="name1",beanInterface=Type1.class),
           @EJB(name="name2",beanInterface=Type2.class)})
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    @TransactionManagement(TransactionManagementType.CONTAINER)
    public class X extends Y{ 
      //code