我有一个POJO,我想注入CDI Bean。现在我知道我可以通过注释'更改beans.xml中的发现模式。全部'。但我也可以给我的POJO一个定义注释的bean。我想任何注释都可以工作,但我想知道,为了使我的POJO可注射的单一目的,正确的注释是什么?
答案 0 :(得分:1)
@Dependent将在每个注入点为该bean创建一个新实例。通常是最不具侵入性的。
http://docs.oracle.com/javaee/7/api/javax/enterprise/context/Dependent.html
答案 1 :(得分:1)
根本没有注释,不需要注释来使bean可注入(即使其成为托管或cdi bean)。
为了注入课程,应该是:
@Decorator
@Inject
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
。
希望回答这个问题。