无作用域的 Bean 的 CDI 注入
CDI injection of beans with no scope
我们有一个 CDI 项目使用:
- Tomee 容器
- 用于 CDI 的 Apache OpenWebBeans
- Deltaspike 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 将开始展示您所描述的行为。
我们有一个 CDI 项目使用:
- Tomee 容器
- 用于 CDI 的 Apache OpenWebBeans
- Deltaspike 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 将开始展示您所描述的行为。