我正在使用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实现。
使用哪个处理程序实例基于某些参数。
答案 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也可能有效),但使用单独的模块非常简单。