【问题标题】:CDI injecting concrete dependencies across jarsCDI 跨 jar 注入具体依赖项
【发布时间】:2016-09-06 21:20:49
【问题描述】:

我对项目设置有点好奇。

我有一个正在尝试更新的项目。

所以我在我的一些具体类中添加了@Named("") 注释。 该类实际上扩展了一个实现接口的抽象类。 我想将命名类注入到该 jar 中未包含的类上。 这样做时我需要牢记哪些注意事项?

【问题讨论】:

    标签: cdi inject named


    【解决方案1】:

    你的问题很模糊,所以不要指望这个答案会让你大吃一惊。

    该类实际上扩展了一个实现接口的抽象类。

    这应该不是问题——最终的 bean 实例将具有层次结构中所有类和接口的类型。没什么好担心的。

    我想将命名类注入到该 jar 中未包含的类上。

    首先,您只能将 bean 注入另一个 bean。这意味着您的其他类(不在同一个 jar 中)必须成为一个 bean。为此,您在其他存档中启用 CDI 并使用所需范围注释该类。

    其次,另一个 jar 必须依赖于带有 @Named bean 的那个,以便 CDI 容器可以看到这些 bean。

    最后但同样重要的是,确保在 bean 上使用足够的范围。范围属于特定的上下文,每个上下文都有不同的生命周期。因此,例如 @ApplicationScoped bean 从应用程序启动到关闭都存在,而 @RequestScoped 仅在 HTTP 请求期间处于活动状态。

    【讨论】:

    • 感谢您的意见。你是对的,这是一个模糊的问题。我是 CDI 的新手,它的功能。当您说使用所需范围注释类时,我已经使用 Named() 注释对其进行了注释。作用域在 CDI 容器中如何工作?您提到 AplicationScope 来自(假设)jvm 启动-关闭,并且 RequestedScoped 生活在每个 HTTP 请求中。我需要注释两个 bean 吗?
    • 你应该看看 [weld.cdi-spec.org/documentation/](documentation).至于您的问题 - @Named 没有给 bean 任何范围,它的目标是使其成为 [docs.jboss.org/weld/reference/latest/en-US/html_single/…(可从 EL 访问)。默认情况下,只有 @Named 注释的 Bean 将具有 @Dependent 范围。在下一个注释中 - @ApplicationScopedCDI 容器启动(CDI 启动并且魔法开始发生的时间点)到其关闭。如果 @Dependent 对你来说足够好,你就不需要注释 bean(猜猜不是)。
    • 至于作用域在 CDI 容器中的工作方式 - 每个作用域都有不同的生命周期,之后它不再存在,与之关联的 bean 将被销毁。例如在请求@RequestScoped bean 之后。一旦弹出新请求,您将获得一个新 bean。你应该也能猜到@SessionScoped 的工作原理。 @ConversationScoped@Dependent 可能更棘手,我(再次)为此建议 Weld 文档。您还可以定义自己的范围。
    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2023-01-19
    • 2015-08-30
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多