【发布时间】:2016-09-06 21:20:49
【问题描述】:
我对项目设置有点好奇。
我有一个正在尝试更新的项目。
所以我在我的一些具体类中添加了@Named("") 注释。 该类实际上扩展了一个实现接口的抽象类。 我想将命名类注入到该 jar 中未包含的类上。 这样做时我需要牢记哪些注意事项?
【问题讨论】:
我对项目设置有点好奇。
我有一个正在尝试更新的项目。
所以我在我的一些具体类中添加了@Named("") 注释。 该类实际上扩展了一个实现接口的抽象类。 我想将命名类注入到该 jar 中未包含的类上。 这样做时我需要牢记哪些注意事项?
【问题讨论】:
你的问题很模糊,所以不要指望这个答案会让你大吃一惊。
该类实际上扩展了一个实现接口的抽象类。
这应该不是问题——最终的 bean 实例将具有层次结构中所有类和接口的类型。没什么好担心的。
我想将命名类注入到该 jar 中未包含的类上。
首先,您只能将 bean 注入另一个 bean。这意味着您的其他类(不在同一个 jar 中)必须成为一个 bean。为此,您在其他存档中启用 CDI 并使用所需范围注释该类。
其次,另一个 jar 必须依赖于带有 @Named bean 的那个,以便 CDI 容器可以看到这些 bean。
最后但同样重要的是,确保在 bean 上使用足够的范围。范围属于特定的上下文,每个上下文都有不同的生命周期。因此,例如 @ApplicationScoped bean 从应用程序启动到关闭都存在,而 @RequestScoped 仅在 HTTP 请求期间处于活动状态。
【讨论】:
@Named 没有给 bean 任何范围,它的目标是使其成为 [docs.jboss.org/weld/reference/latest/en-US/html_single/…(可从 EL 访问)。默认情况下,只有 @Named 注释的 Bean 将具有 @Dependent 范围。在下一个注释中 - @ApplicationScoped 从 CDI 容器启动(CDI 启动并且魔法开始发生的时间点)到其关闭。如果 @Dependent 对你来说足够好,你就不需要注释 bean(猜猜不是)。
@RequestScoped bean 之后。一旦弹出新请求,您将获得一个新 bean。你应该也能猜到@SessionScoped 的工作原理。 @ConversationScoped 和 @Dependent 可能更棘手,我(再次)为此建议 Weld 文档。您还可以定义自己的范围。