31

我正在将应用程序迁移到 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;

}

但是,如果我更改bean-discovery-mode="all"bean-discovery-mode="annotated"容器,则无法将实例注入该字段lc

我必须如何注释LoggingClass才能bean-discovery-mode="annotated"正确使用?

4

3 回答 3

44

bean-discovery-mode="annotated"只使用带有bean 定义注解的类时, 会被发现。所有其他类都被忽略。任何范围类型都是定义注解的 bean。如果在 bean 类上声明了范围类型,则称该 bean 类具有 bean 定义注释[spec]。1.1 规范在这里并不完全清楚。仅发现具有@NormalScope作用域或@Dependent伪作用域的类,而忽略@javax.inject.Singleton所有其他@Scope(伪)作用域。

请注意,“bean 定义注释”的定义在 CDI 1.2 中发生了变化,现在定义得很好:

bean 定义注释集包含:

  • @ApplicationScoped、@SessionScoped、@ConversationScoped 和 @RequestScoped 注释,
  • 所有其他正常范围类型,
  • @Interceptor 和 @Decorator 注解,
  • 所有原型注释(即用@Stereotype 注释的注释)和@Dependent 范围注释。
于 2015-03-20T13:41:31.000 回答
39

实际上,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");
}

在 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

于 2013-08-19T21:33:36.580 回答
1

我也同意@rmuller 的回答形式。但我想指出的是,应用服务器 Payara 和 Wildfly 上仍然存在不同的行为。请参阅以下示例,其中包含普通的非作用域类但具有 @EJB 注入:

public class SomeClass  {
    @EJB
    MyService myService;

   ...
}

如果您提供 beans.xml 文件:

 .... version="1.2" bean-discovery-mode="annotated"....

Payara 4.1 将类SomeClass NOT 视为 CDI bean,并且不会注入服务 EJB。我很清楚它的行为如规范中所述。

但是 Wildfly 10 将该类视为 CDI bean 并注入了预期之外的服务 EJB。要使其正常工作, beans.xml 文件应如下所示:

 .... version="1.2" bean-discovery-mode="all"....

令人惊讶的是,两个最常见的应用程序服务器在行为上是不同的。

于 2018-03-14T13:42:05.790 回答