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

xan*_*oss 37 java-ee-6 jpa-2.0 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新组件模型的部分内容.

Bre*_*ail 31

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

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

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

  • @Inject版本将尊重EJB的范围.例如,使用@EJB将SFSB注入到servlet中是没有意义的,因为每个请求只存在一个SFSB.使用@Inject将@SessionScoped SFSB注入servlet意味着您有一个CDI代理,可以根据需要为每个会话创建一个新的SFSB. (6认同)
  • Bean部署档案.它是一个包含beans.xml的JAR. (4认同)

小智 10

来自Adam Biens的博客:

您可以使用两个注释来注入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 {
}
Run Code Online (Sandbox Code Playgroud)

另一方面,@ 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 "";
}
Run Code Online (Sandbox Code Playgroud)

  • 在这个博客http://www.adam-bien.com/roller/abien/entry/inject_vs_ejb上逐字复制回复答案而不给予信任. (4认同)

vic*_*era 6

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

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