40

我目前正在学习新的 Java EE 6 组件模型,并且对最新的依赖注入机制感到困惑。所以这是我的问题:

1)@Inject 和@EJB 有什么区别

2) 如果我有一个包含另一个 POJO(其中一个是 DAO 代码)的简单 POJO,那么更好的选择是:@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 新组件模型的零碎部分。

4

3 回答 3

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

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

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

于 2011-05-09T03:58:57.920 回答
13

来自亚当·比恩斯的博客:

您可以使用这两个注释来注入 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 "";
}
于 2014-05-06T11:11:30.773 回答
6
  1. @Inject 比 EJB 更通用,是 CDI 规范的一部分。所以如果你想使用@Inject,你需要在你的服务器中实现它。

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

于 2011-05-09T05:22:42.917 回答