无作用域的 Bean 的 CDI 注入

CDI injection of beans with no scope

我们有一个 CDI 项目使用:

在 webapp 的 beans.xml 文件中,发现模式配置为推荐设置:bean-discovery-mode="annotated"。尽管如此,我还是能够注入这个 class,它没有用范围注释:

public class TestClass implements Serializable {
    public String getDescription() {
        return "This is a test class";
    }
}

进入这个 ViewScoped class 没有任何问题:

@ViewScoped
@Named
public class AuthenticationWebBean implements Serializable {

    @Inject
    private TestClass testClass;

我原以为这会引发异常,或者将该字段保留为空。这里发生了什么,注入的 Object 会与它注入的 object 具有相同的作用域吗?

提前致谢。

TomEE 通常仅支持 Java EE 6,仅夜间构建支持 Java EE 7。bean-discovery-mode="annotated" 仅在 Java EE 7 中受支持。这意味着在TomEE 它很可能被忽略,然后所有 bean 都被考虑用于注入。如果你想从注入中排除一个 bean,用 @Alternative 注释它。否则,bean 将被注入到与其注入的 bean 相同的范围内。这相当于 @Dependent 作用域,这是默认的。

您描述的行为在 CDI 1.1/1.2 中,Java EE 7 兼容容器将遵循它。

您使用的是 TomEE 1.7.2,它与 Java EE 6/CDI 1.0 兼容。它将在 CDI 1.0 的规则下运行,这使得一切都成为 CDI 组件。

TomEE 7 将开始展示您所描述的行为。