我可以像使用Spring的XML一样使用Guice配置特定对象吗?

时间:2014-12-30 16:56:17

标签: guice

我有一个现有的库我正在尝试集成到使用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对象 是我的应用程序的一部分。 all实现了com.foo.jms.Consumer所属的同一现有库提供的接口。基本上,我有几个消费者被配置为侦听不同的消息并在接口的特定实现上调用函数。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这看起来像是Binding Annotations的工作!

在您的模块中,您可以像这样使用它:

@Named("someJMSMessageConsumer)
@Provides
Consumer getSomeJMSMessageConsumer(SomeJMSMessageHandler handler) {
    // handler has been automagically injected by Guice
    return new Customer(handler);
}

正如您所看到的,如果您需要为调用Customer的构造函数注入其他依赖项,只需将它们作为参数添加到getSomeJMSMessageConsumer方法中 - Guice将注入它们。

为另一个实例执行此操作(当然,这次使用@Provides注释@Named(anotherJMSMessageConsumer)方法),根据需要更改参数等。

现在您可以像这样注入选定的实例:

@Inject
public SomeClass(@Named("someJMSMessageConsumer") Customer customer) {
}

您可以创建自己的自定义注释,而不是Named。您可以使用@Provides代替Provider方法。这些例子在上面链接的Guice文档中。