【问题标题】:Can I configure specific objects with Guice like I can with Spring's XML?我可以像使用 Spring 的 XML 一样使用 Guice 配置特定对象吗?
【发布时间】: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


【解决方案1】:

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

在你的模块中你可以这样使用它:

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

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

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

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

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

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

【讨论】:

  • 非常感谢您提供这些信息。我实际上已经决定不使用要求我使用 Guice 的应用程序,所以我不会用代码测试/确认这是正确的。但是,这完全有道理,我会接受。添加一个问题:我可以以某种方式将 Guice 配置为在应用程序加载时非延迟加载 someJMSMessageConsumer 作为单例吗?它不打算连接到任何东西,但仍需要实例化。
  • Non-lazily 的意思是......急切地 :) Guice 就是这样:eager singletons
猜你喜欢
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2014-12-15
相关资源
最近更新 更多