我已经习惯了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;
...
}
嗯,这不起作用,因为我得到了一个不明确的依赖,正如你在我链接的问题上看到的那样。我想知道我应该做的是使用制作人还是类似的东西。任何人都可以启发我的有效方法,或者可能是替代方案吗?
答案 0 :(得分:1)
当你想要以某种可能变化的方式实例化一个类型然后将它交给CDI说“嘿,如果有人注入这种类型,给他这个实例”时,会使用生产者(当然非常简化的版本) )。根据你所描述的,你应该对普通注射和豆子创造足够好,我认为不需要生产者。
从你的两个问题我都可以看出注射实际上是有效的,但有一些含糊之处。我的意思是,一个注射点有几个可能的候选者。只有在你的情况下,它们是相同的,这意味着该类必须以某种方式加载两次,某处 - 继续向这个方向挖掘。
从架构的角度来看,使用CDI将您的核心提取为CDI库完全可以(我会说很常见),然后由项目的其他部分使用。只需确保您的所有档案都被视为“bean档案”。实现这一目标的最简单方法是确保在其中包含beans.xml
。