【问题标题】:CDI injection of bean from parent module to child modulebean从父模块到子模块的CDI注入
【发布时间】:2016-03-01 08:04:31
【问题描述】:

仅关于 CDI bean 的问题,而不是 EJB。

开发需要将 bean 从父模块注入到子模块的架构是一种好习惯吗?

例如我有三个模块:

  1. common - 这里我需要使用一些环境设置,但 common 不知道它将在哪个环境中执行,客户端或服务器(在我的情况下它被打包为ear/lib 目录中的一个 lib,由 java se 客户端单独测试);
  2. client - 在这里我可以提供属性文件的设置,例如(出于测试目的,它没有打包在 ear 中)
  3. 服务器 - 在这里我可以提供来自 ejb 配置文件的设置(它是一个与 common 相同的 ejb 模块)。

所以 client 依赖于 commonserver 依赖于 common (它们从 common 扩展和使用类)但注射方向相反。所以@Inject注入点存在于common模块中,而producer方法存在于clientserver中。

除了哲学方面,我还有一个真正的问题。我可以进一步将 bean 从 ejb.jar 注入到 ear/lib/*.jar 还是由于类路径问题而无法实现?

问候

【问题讨论】:

  • 介意用mcve更新您的帖子吗?
  • 这是一个最小而完整的问题
  • 确实,只是关于“...注入反向...”。您是否共同从服务器/客户端注入组件?这就是示例的需要。
  • oo,我明白了,提供了问题正文中的信息,谢谢

标签: jakarta-ee cdi


【解决方案1】:

你没有提到你的部署设置,所以我只能猜测客户端和服务器是单独打包的,而不是在同一个 EAR 中? 另外,除非您将 common 的内容直接复制到模块中,或者您的模块扩展了 common 类,否则我不明白您所说的 parent 和 child 是什么意思。
循环依赖不是一个好习惯,它使测试变得困难并且紧密耦合你的代码。 Common 不应依赖于在另一个模块中拥有一个 bean 来运行。

您可以跨模块注入,但它们必须在 meta-inf 中定义自己的 beans.xml。

【讨论】:

  • client.jar 用于测试目的,完全没有打包。 common.jar 是ear/lib 目录下的一个lib,server.jar 是一个ejb 模块。我对跨平台解决方案感兴趣,所以我没有提到具体的应用服务器。
  • 不管怎样,你的回答很有帮助
  • 虽然 EAR/lib 目录中的 jars 被认为是用于类加载目的的单个“模块”,但它们通常无法访问其他模块(Web、EJB 等)中的类。只有反过来才是正确的。 IE。其他 EAR 模块中的类可以看到 EAR/lib 目录中的类。
  • WAR/lib 中的库可以看到所有其他类,因此对于耳朵来说同样适用是合乎逻辑的(这意味着 EAR/lib 使用与其他模块相同的类加载器并且它们可以看到彼此)。编辑:如果它没有自动完成,您可以在容器中打开它或在清单文件中使用类路径条目(在 wildfly 中像这样:docs.jboss.org/author/display/WFLY8/Class+Loading+in+WildFly
猜你喜欢
  • 1970-01-01
  • 2013-06-21
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-06-09
  • 2016-10-31
  • 2013-07-10
相关资源
最近更新 更多