【发布时间】:2014-12-30 16:56:16
【问题描述】:
我有一个现有的库,我正在尝试将其集成到使用 Guise for DI 的应用程序中。我是 Guice 的新手,但我对 XML 配置的 Spring 有一些经验。我正试图弄清楚如何用 Guice 做一些我知道如何用 Spring 做的事情。
在另一个弹簧配置的应用程序中,我有一大块配置 XML,如下所示:
<!-- consumer 1 -->
<bean id="someJMSMessageConsumer" class="com.foo.jms.Consumer">
<constructor-arg index="0" ref="settings" />
<constructor-arg index="1">
<bean class="com.foo.bar.SomeJMSMessageHandler" />
</constructor-arg>
<constructor-arg index="2" value="MyClientId" />
<constructor-arg index="3" value="SOME.JMS.MESSAGE" />
<constructor-arg index="4" value="false" />
<constructor-arg index="5" ref="signatureService"/>
</bean>
<!-- consumer 2 -->
<bean id="anotherJMSMessageConsumer" class="com.foo.jms.Consumer">
<constructor-arg index="0" ref="settings" />
<constructor-arg index="1">
<bean class="com.foo.bar.AnotherJMSMessageHandler" />
</constructor-arg>
<constructor-arg index="2" value="MyClientId" />
<constructor-arg index="3" value="ANOTHER.JMS.MESSAGE" />
<constructor-arg index="4" value="false" />
<constructor-arg index="5" ref="signatureService"/>
</bean>
请注意,这两个 bean 都是 com.foo.jms.Consumer 的实例,只是配置不同。这两个对象都会立即实例化(不是 Lazy),然后等待发生。
那么,我如何告诉 Guice 实例化这两个不同的实例并注入它们不同的依赖项。我想我会在 configure() 方法中这样做,但我不知道如何。
另一个重要的一点是 com.foo.jms.Consumer 是我正在实现的现有库的一部分。虽然我可以编辑这个库,但我宁愿不这样做,以免破坏使用它的任何其他应用程序。
同样重要的是要注意 com.foo.bar.whatever 对象 是 我的应用程序的一部分。它们都实现了由 com.foo.jms.Consumer 来自的同一个现有库提供的接口。基本上,我有几个消费者配置为监听不同的消息并在接口的特定实现上调用函数。
有什么想法吗?
【问题讨论】:
-
更多阅读表明 PrivateModule 可能是最好的解决方案。但是,看起来我必须为每个需要配置的 com.foo.jms.Consumer 对象编写一个 PrivateModule 类。对吗?
标签: guice