【发布时间】:2015-10-16 14:45:54
【问题描述】:
我们有一个 CDI 项目使用:
- Tomee 容器
- 用于 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;
我本来希望这要么引发异常,要么将字段保留为空。这里发生了什么,注入的Object 是否与注入的object 具有相同的范围?
提前致谢。
【问题讨论】:
-
TestClass享有默认的 CDI 范围,即@Dependent,它将在每次请求时创建(不一定只是 HTTP 请求)。在注入点注入代理,每个请求可能是不同的实例。 (TestClass在注入点的实例可能与它在创建时的不同,因为注入的实例不是真实的实例——它是一个被称为代理的假实例)。功能需求是什么? -
嗯,有道理,感谢您提供的信息。我问的原因是因为当 javax.faces 库包含在 webapp 库而不是 Tomee 库中时,我们看到了大量的内存泄漏,请求的每个页面都会导致在 WebContext 中创建大量的 Faces 对象并且永远不会释放。我怀疑这是我上面提到的行为的副作用,现在我知道@Dependent 范围是有道理的!移动 faces 库解决了内存泄漏问题。
-
您可以在 bean 上使用裸
javax.enterprise.inject.Typed注释来防止它被注册为 CDI 托管 bean。 "当指定@Typed注解时,只有使用value成员显式列出其类的类型以及Object,才是bean 的bean 类型。" -
感谢您的帮助 Tiny!
-
@Tiny 为什么你认为 TestClass 获得
@Dependent范围? Bean 发现模式设置为“带注释”,因此该 bean 根本不应该出现“不满足的依赖关系”错误消息。它没有按预期工作。