Java @EJBs注释做什么?
我大致知道这个构造的作用:它创建一个sometypejb并将对象注入另一个EJBJava @EJBs注释做什么?,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我大致知道这个构造的作用:它创建一个sometypejb并将对象注入另一个EJB @EJB(name="name1") SomeType someVariable 现在我有一个这样开始的类:(我给出了所有类级别的注释,尽管我认为只有@ejb是相关的) @EJBs在这里做什么?他们可能会获得或创建“名称1”。。。对象,但它们将结果放在哪里?我在附近没有看到.lookup调用,但是代码库很大,所以我对此不是很确定 附加问题:我假设两个@Transaction注释只是重复默认值 更新:此时有多人
@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
查找(“java:comp/env/myEJB”)
还是由于注入无关:
lookup
属性需要JNDI查找来解析目标mappedName
。这通常通过执行查找来实现beanInterface
或字段类型)仅由应用程序中的单个EJB实现,那么EJB规范要求它返回到该类型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