@Inject和@EJB之间有什么区别

时间:2011-05-04 20:57:09

标签: jpa-2.0 java-ee-6 ejb-3.1

我目前正在学习新的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新组件模型的部分内容。

3 个答案:

答案 0 :(得分:30)

  1. @EJB仅注入EJB,但@Inject可用于注入POJO而不是EJB。但是,@ Inject要求您的存档是BDA(包含EE6的beans.xml,或隐含在EE 7中)。 @Inject还具有其他CDI特定功能(范围,拦截器等),但这些功能会产生额外的开销。应用程序服务器支持指定@EJB绑定,以便部署者可以选择目标EJB,但@Inject仅允许应用程序开发人员选择目标EJB(并且它必须存在于应用程序中)。

  2. 如果目标不是EJB,则不得使用@EJB。

  3. 这取决于您是否正在进行多个相互关联的查询,然后尝试做出业务决策。您需要了解隔离级别并将其考虑在内,即使对于只读操作也是如此。

答案 1 :(得分:10)

来自Adam Biens Weblog:

您可以使用这两个注释来注入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)

  1. @Inject比EJB更通用,是CDI规范的一部分。因此,如果您想使用@Inject,则需要在服务器中实现它。

  2. 对于POJO(不是EJB),您必须使用@Inject。