java类可注入的正确注释是什么?

时间:2016-06-16 14:02:46

标签: cdi

我有一个POJO,我想注入CDI Bean。现在我知道我可以通过注释'更改beans.xml中的发现模式。全部'。但我也可以给我的POJO一个定义注释的bean。我想任何注释都可以工作,但我想知道,为了使我的POJO可注射的单一目的,正确的注释是什么?

3 个答案:

答案 0 :(得分:1)

@Dependent将在每个注入点为该bean创建一个新实例。通常是最不具侵入性的。

http://docs.oracle.com/javaee/7/api/javax/enterprise/context/Dependent.html

答案 1 :(得分:1)

根本没有注释,不需要注释来使bean可注入(即使其成为托管或cdi bean)。

为了注入课程,应该是:

  • 具体类(即非抽象或接口)或它应注释为@Decorator
  • 应该使用@Inject
  • 注释no-arg构造函数或构造函数
  • 不应使用EJB组件定义注释或在ejb-jar.xml中声明为EJB bean类进行注释。

所以你可以注射所有'普通'类。此外,该类应位于bean存档中。从CDI 1.1开始,有两种类型的bean归档:隐式和显式。来自Oracle文档:

  

显式bean归档文件是包含beans.xml的归档文件   部署描述符,可以是空文件,不包含任何版本   number,或包含bean-discovery-mode的版本号1.1   属性设置为全部。例如:

     

http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd“          version =“1.1”bean-discovery-mode =“all”>       ... CDI可以在显式存档中管理和注入任何bean,但使用@Vetoed注释的除外。

     

隐式bean归档是包含一些bean的归档   使用范围类型注释,不包含beans.xml部署   描述符,或包含beans.xml部署描述符   bean-discovery-mode属性设置为annotated。

     

在隐式存档中,CDI只能管理和注入注释的bean   范围类型。

     

对于Web应用程序,beans.xml部署描述符if   目前,必须在WEB-INF目录中。对于EJB模块或JAR   文件,beans.xml部署描述符(如果存在)必须在   META-INF目录。

答案 2 :(得分:1)

假设你想继续使用bean发现模式annotated,你需要在你的POJO上有一个 bean-defined annotation ,这将使它成为所谓的implicit bean。以下是CDI spec的相关引文:

  

定义注释的bean集包含:

     
      
  • @ApplicationScoped,@ SessionScoped,@ ConversationScoped和@RequestScoped annotations,

  •   
  • 所有其他正常范围类型,

  •   
  • @Interceptor和@Decorator annotations,

  •   
  • 所有刻板印象注释(即用@Stereotype注释的注释),

  •   
  • 和@Dependent范围注释。

  •   

哪个注释正确 - 这取决于您的用例。通常,您需要考虑bean的生命周期(请求,对话,应用程序作用域,只要应用程序存在)。但如果你真的不在乎,我会说只需去@Dependent。 事实上,如果你有bean发现模式all并且在那个POJO类上没有注释,那么它将被CDI选为@Dependent

希望回答这个问题。