【问题标题】:Is it possible to make use of a dependency CDI with wildfly?是否可以通过 wildfly 使用依赖项 CDI?
【发布时间】:2017-12-05 10:13:19
【问题描述】:

我已经习惯了 Spring 框架依赖注入之类的东西,所以我对 JBoss 非常满意。我可能想做一些不可能的事情。

在我们公司,我们从一个原型开始,其中包含所有依赖注入。我们有一个这样声明的类:

@ApplicationScoped
public class MessageHandlerImpl implements MessageHandler {
    ...
}

然后我将它注入到另一个类中,如下所示:

@ApplicationScoped
public class MessageReceiverImpl implements MessageReceiver {

    @Inject
    MessageHandler messageHandler;
    ...

}

原型被接受,现在我们正在组织这个项目,在核心项目上隔离一些通用代码。

在我们将其分开之前,这些注射工作正常。关于这个问题的更多细节被问到这个问题:Ambiguous dependency with only one @ApplicationScoped class

我退后一步,考虑到可能我正在做的事情对于 wildfly-swarm 是不可能的,或者我正在尝试的整个概念是错误的。

我想做的是在我的核心项目上完成所有 CDI,并且只在我的依赖项目上使用 @Inject 注释。所以在我的依赖项目中,我会有类似的东西:

@ApplicationScoped
public class WSClient {

    @Inject
    MessageReceiver messageReceiver;

    ...

}

嗯,这不起作用,因为我得到了一个不明确的依赖项,正如您在我链接的问题中看到的那样。我想知道我应该做的是使用 Producer 或类似的东西。谁能告诉我一个有效的方法,或者替代方法?

【问题讨论】:

  • 生产者用于当你想以某种可能变化的方式实例化一个类型,然后把它交给 CDI 说“嘿,如果有人注入这个类型,给他这个实例”( c) 的非常简化的版本。所以在你的情况下,一个简单的注入就足够了,我认为不需要生产者,它实际上可以工作,但有一些歧义,这意味着该类必须以某种方式在某个地方加载了两次 - 继续朝那个方向挖掘。跨度>
  • @Siliarus 我正在努力。非常感谢您的意见,我理解您所说的制片人,现在我更清楚了。从架构的角度来看呢?将这些 CDI 注释放在我的核心上,使其特定于技术是否不错?我真的不知道 JBoss 有什么好的做法。
  • 将内核分离是非常好的,是的,您可以这样使用 CDI。事实上,这很常见。只需确保所有单独的 JAR 都是 bean 档案(例如,最简单的方法是在其中包含 beans.xml)——我想你有,否则这些 bean 不会被检测到。
  • @Siliarus 再次感谢您,如果您想将您的 cmets 作为答案,我会接受。

标签: java jboss cdi wildfly-swarm


【解决方案1】:

当您想以某种可能变化的方式实例化一个类型,然后将它交给 CDI 说“嘿,如果有人注入这种类型,给他这个实例”(当然是非常简化的版本)时,就会使用生产者)。根据您的描述,您应该对普通注入和 bean 创建足够好,我认为不需要生产者。

从您的两个问题中,我可以看出注射实际上甚至有效,但存在一些模棱两可的地方。我的意思是一个注入点有几个可能的候选者。只有在您的情况下,它们是相同的,这意味着该类必须以某种方式在某个地方加载了两次 - 继续朝那个方向挖掘。

从架构的角度来看,使用 CDI 完全可以(我会说很常见)将您的核心提取为 CDI 库,然后供项目的其他部分使用。只需确保您的所有档案都被视为“bean 档案”。实现这一目标的最简单方法是确保在其中包含 beans.xml

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 2016-07-15
    • 1970-01-01
    • 2020-04-28
    • 2015-08-20
    • 1970-01-01
    • 2014-08-07
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多