如何通过Guice注入具有不同依赖性的3个相同类型的实例?

时间:2015-02-15 05:29:02

标签: spring dependency-injection guice guice-3

我正在使用Guice来管理我的班级依赖。我有一个LogicHandler类,它依赖于几个Components类。

  public interface LogicHandler {
      private Component component1;
      private Component component2;
      private Component component3;
  }

  public interface Component {
      public String doWork();
  }

我将有3个LoigcHanlder实例。使用哪个实例将在运行时决定。每个实例都将具有不同的Component实现,并且所有实现都是预定义的。

如果我使用spring DI,xml配置将如下所示:

<bean id="handler1" class="org.sample.handlers.DefaultHanlder">
  <property name="component1" ref="componentImplementationA" />
  <property name="component2" ref="componentImplementationB" />
  <property name="component3" ref="componentImplementationC" />
</bean>

<bean id="handler2" class="org.sample.handlers.DefaultHanlder">
  <property name="component1" ref="componentImplementationD" />
  <property name="component2" ref="componentImplementationE" />
  <property name="component3" ref="componentImplementationF" />
</bean>

<bean id="handler3" class="org.sample.handlers.DefaultHanlder">
  <property name="component1" ref="componentImplementationG" />
  <property name="component2" ref="componentImplementationH" />
  <property name="component3" ref="componentImplementationI" />
</bean>

注意:所有处理程序都由DefaultHanlder实现。

使用哪个处理程序实例基于某些参数。

2 个答案:

答案 0 :(得分:0)

使用限定符(例如@Named(&#34; handler1&#34;))并显式绑定您的实例。

 bind(Component.class).annotatedWith(Names.named("handler1").toInstance(...);

答案 1 :(得分:0)

假设我正确理解了您的问题,您希望选择一个特定的具体实现来基于特定参数进行绑定。一种方法是创建一个模块,该模块将决定绑定哪个模块所需的参数作为构造函数。绑定特定具体实现的逻辑将在模块的bind方法中。 E.g

public class YourModule extends AbstractModule {

Parameters settings;

public YourModule(Parameters settings) {
    this.settings = settings;
}

@Override
protected void configure() {
   if(settings.val == 1) {
      bind(DefaultHanlder.class).toInstance(ComponentA.class);
   } else if(settings.val == 2) {
      bind(DefaultHanlder.class).toInstance(ComponentB.class);
   }
   .
   .
   .
}

创建进样器时,请使用YourModule模块,以便正确接线。然后,注入器应为DefaultHanlder注入适当的具体类,而无需客户端代码知道如何选择正确的具体实现。

也可能有其他方法可以做到这一点(例如AssistedInjection也可能有效),但使用单独的模块非常简单。