Oli*_*ver 28 dependency-injection cdi java-ee-7
我正在将应用程序迁移到Java EE 7并且想要CDI 1.1.但我没有得到的意思bean-discovery-mode="annotated".该
CDI 1.1规范是不是非常有帮助.至少我没有找到任何有用的段落.我错过了吗?
这个例子完美地运行bean-discovery-mode="all"并注入一个实例LoggingClass:
public class LoggingClass {
public Logger logger = Logger.getLogger("ALOGGER");
}
@Test
public class MMLoggerProducerIT extends Arquillian {
@Inject private LoggingClass lc;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我从改变bean-discovery-mode="all"到bean-discovery-mode="annotated"容器不能够注入的情况下进入该领域lc.
如何正确注释LoggingClass才能bean-discovery-mode="annotated"正确使用?
rmu*_*ler 41
当bean-discovery-mode="annotated"仅使用具有定义注释 的bean的类时,会发现它.所有其他类都被忽略.任何范围类型都是定义注释的bean.如果在bean类上声明了作用域类型,则说bean类具有定义注释 [spec] 的bean.1.1规范在这里并不完全清楚.仅发现具有@NormalScope范围或@Dependent伪范围的类,@javax.inject.Singleton并忽略所有其他@Scope(伪)范围.
请注意,"bean定义注释"的定义在CDI 1.2中已更改,现在定义得非常好:
定义注释的bean集包含:
- @ ApplicationScoped,@ SessionScoped,@ ConversationScoped和@RequestScoped注释,
- 所有其他正常范围类型,
- @Interceptor和@Decorator注释,
- 所有构造型注释(即使用@Stereotype注释的注释)和@Dependent范围注释.
Ian*_*ans 36
实际上,bean-discovery-mode="ALL"打开存档中所有类的扫描.这称为"显式存档".
省略beans.xml或设置bean-discovery-mode="ANNOTATED"会使归档成为隐式归档.在这种情况下,容器将扫描具有注释范围类型的bean.
这解释了为什么LoggingClass在设置时没有注入bean-discovery-mode="ANNOTATED".如Java EE 7教程中所述:
CDI只能在隐式存档中管理和注入使用范围类型注释的bean.
编辑:所以为了绝对清楚,您需要添加范围类型LoggingClass.所以像这样:
@SessionScoped
public class LoggingClass {
public Logger logger = Logger.getLogger("ALOGGER");
}
Run Code Online (Sandbox Code Playgroud)
在Java EE 7和CDI 1.1中,我们删除了包含beans.xml部署描述符以打开存档的CDI的要求,使CDI 1.1与部署描述符是可选的大多数其他Java EE API一致.它还删除了包含beans.xml与否的二进制开/关性质.您可以使用中的设置控制容器扫描的文件bean-discovery-mode.
请参阅有关打包CDI应用程序的JavaEE教程:http: //docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE