【问题标题】:CDI injection of beans with no scope没有范围的 CDI 注入 bean
【发布时间】: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 根本不应该出现“不满足的依赖关系”错误消息。它没有按预期工作。

标签: java cdi


【解决方案1】:

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

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

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

【讨论】:

  • 但是 TomEE 7 会发布吗?还是会像 Geronimo 一样,虽然他们从未说过要停下来,但还是停下了脚步?
  • 它正在积极开发中。随意浏览邮件列表,打个招呼。
  • @john.ament 如果团队对此进行更多交流会很酷。前段时间他们在被推了一点之后说2015年初,那已经有点晚了。但现在我们已接近 2015 年年底,2015 年是否会成为一个选项还是个问题。
  • @john.ament p.s.当然,TomEE/Apache 没有任何义务迟早交付,所以如果是 2016 年,那就是 2016 年,但只是偶尔发布关于进度和目标日期的博客或推文会很棒;)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多