@EJBs注释有什么作用?

hyp*_*man 38 java ejb java-ee

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

 @EJB(name="name1")
 SomeType someVariable
Run Code Online (Sandbox Code Playgroud)

现在我有一个类似于这样开始的类:(我给出所有类级别的注释,即使我认为只有@EJBs相关的)

@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
Run Code Online (Sandbox Code Playgroud)

这是做什么的@EJB?他们可能从JNDI获取或创建"name1"......对象,但他们在哪里放置结果?我没有看到.lookup任何附近的电话,但代码库是巨大的,所以我不太确定这一点.

奖金问题:我认为这两个@Transaction注释只是重复默认值?

更新:此时多个人声称@EJBs是专有扩展.它不是.它是java EE5的核心部分.有关详细信息,请参阅JavaDoc..它只是个别@EJB注释的容器.

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

Bre*_*ail 39

@EJB注解(和@Resource,@WebServiceRef等),有两个目的:

  1. 它在组件名称空间中声明了一个引用.例如,@EJB(name="myEJB")创建一个引用java:comp/env/myEJB.如果您注释一个字段而没有指定名称,那么它会创建一个引用java:comp/env/com.example.MyClass/myField.
  2. 如果在字段或setter方法上声明注释,则容器在创建组件时执行注入.

如何解决引用的方式各不相同,无论引用是针对a lookup("java:comp/env/myEJB")还是由于注入而解决:

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