CDI注入没有范围的bean

时间:2015-10-16 14:45:55

标签: java cdi

我们有一个CDI项目使用:

  • Tomee Container
  • 适用于CDI的Apache OpenWebBeans
  • Deltaspike CDI扩展

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

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

进入此ViewScoped课程没有任何问题:

@ViewScoped
@Named
public class AuthenticationWebBean implements Serializable {

    @Inject
    private TestClass testClass;

我原以为这会抛出一个异常,或者将该字段保留为null。这里发生了什么,注入的Object与注入的object的范围是否相同?

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

TomEE通常仅支持Java EE 6,只有夜间版本支持Java EE 7. {J}仅支持Java EE 7.这意味着在TomEE中它很可能被忽略,然后所有bean都被考虑用于注入。如果要从注入中排除bean,请使用bean-discovery-mode="annotated"对其进行注释。否则,bean将注入与注入的bean相同的范围。这相当于@Alternative范围,这是默认范围。