我目前正在学习新的Java EE 6组件模型,并且与最新的依赖注入机制相混淆。所以这是我的问题:
1)@ Inject和@EJB
之间有什么区别2)如果我有一个包含另一个POJO的简单POJO(其中一个是DAO代码),那么更好的选择是什么:@Inject或@EJB?
我可以混用@Inject和@EJB吗?
一个例子是:
ClassA实现了InterfaceA并具有 ClassA_Adaptor的一个实例
ClassA_Adaptor实现InterfaceAB 并有一个ClassB
ClassB实现了InterfaceB并具有 ClassB_Adaptor的一个实例和一个 实例DAO_ClassB
ClassB_Adaptor实现了InterfaceB 并有一个ClassC
ClassC实现了InterfaceBC并具有 WebService_ClassC
DAO_ClassB将使用JPA 2.0 (@PersistenceContext)
我想要注入所有这些内容,包括DAO和WebService。
3)仅对某些操作使用事务处理而不是所有操作都是一种不好的方法吗?
作为示例:DAO_ClassB中的某些方法是典型的查询,而其他方法是“写入”方法。不用事务包装“READ”方法是不是很糟糕?
据我所知,DAO_ClassB可以使用@EJB包装事务(注入DAO_ClassB并使所有方法都是事务性的)。我该如何控制它?
很抱歉,如果有些问题令人困惑,因为我只知道Java EE 6新组件模型的部分内容。
答案 0 :(得分:30)
@EJB仅注入EJB,但@Inject可用于注入POJO而不是EJB。但是,@ Inject要求您的存档是BDA(包含EE6的beans.xml,或隐含在EE 7中)。 @Inject还具有其他CDI特定功能(范围,拦截器等),但这些功能会产生额外的开销。应用程序服务器支持指定@EJB绑定,以便部署者可以选择目标EJB,但@Inject仅允许应用程序开发人员选择目标EJB(并且它必须存在于应用程序中)。
如果目标不是EJB,则不得使用@EJB。
这取决于您是否正在进行多个相互关联的查询,然后尝试做出业务决策。您需要了解隔离级别并将其考虑在内,即使对于只读操作也是如此。
答案 1 :(得分:10)
您可以使用这两个注释来注入EJB。从@Inject开始,如果遇到任何问题,请切换到@EJB。
@Inject does not have any methods / attributes--it is just a plain annotation:
@Target(value = {ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface Inject {
}
另一方面,@ EJB注释允许您传递其他信息,这些信息可能对引用远程EJB或EJB无法在“约定优于配置”样式中进行简单注入有用:
@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface EJB {
public String name() default "";
public String beanName() default "";
public Class beanInterface() default Object.class;
public String mappedName() default "";
}
答案 2 :(得分:5)
@Inject比EJB更通用,是CDI规范的一部分。因此,如果您想使用@Inject,则需要在服务器中实现它。
对于POJO(不是EJB),您必须使用@Inject。