Java 基于条件的依赖注入
我正在使用策略设计模式,并希望根据某些条件注入不同的依赖项Java 基于条件的依赖注入,java,dependency-injection,guice,Java,Dependency Injection,Guice,我正在使用策略设计模式,并希望根据某些条件注入不同的依赖项 public interface strategy { public void task(); } public class concreteStrategyOne implements strategy { public void task() { //task strategy one } } public class concreteStrategyTwo implements stra
public interface strategy {
public void task();
}
public class concreteStrategyOne implements strategy {
public void task() {
//task strategy one
}
}
public class concreteStrategyTwo implements strategy {
public void task() {
//task strategy two
}
}
public class taskInHand {
private Strategy strategyImpl;
@Inject
public taskInHand(Strategy strategyImpl){
this.strategy = strategyImpl;
}
public void use(Object obj) {
if(obj.get("something") == 1){
strategyImpl.task();
// I want to call task() implemented in concreteStrategyOne
}
else if(obj.get("something") == 2){
strategtImpl.task()
// I want to call task() implemented in concreteStrategyTwo
}
}
}
我知道在注入时可以在构造函数中使用@Named注释来绑定特定的类,但我想根据上述条件注入不同的依赖项
因此,要详细说明。。如果object.getsomething返回1,那么我希望运行在concreteStrategyOne中实现的任务
如何做到这一点?您可以使用一个提供者,我认为Guice称之为提供者,它选择所需的实现并注入所需的实现。但您需要向提供商提供做出决策所需的所有信息。这可能会破坏封装和其他一些可靠的想法 另一个选项是注入所有实现的集合,迭代该集合,如果发现实现负责或适合特定用例,则让实现“volounteer”
有关提供程序的更多详细信息可以在中找到。您可以使用一个提供程序,我认为Guice称之为提供程序,它选择所需的实现并注入所需的实现。但您需要向提供商提供做出决策所需的所有信息。这可能会破坏封装和其他一些可靠的想法 另一个选项是注入所有实现的集合,迭代该集合,如果发现实现负责或适合特定用例,则让实现“volounteer” 有关提供商的更多详细信息,请参见。您可以创建一个StrategyFactory 公共级战略工厂{ @注入 //战略一在这里实施 私人战略一; @注入 //策略二在这里实施 私人战略二; 公共策略获取策略字符串{ 如果某物,等于某个条件{ 返回策略一; }否则{ 返回策略二; } } } 在taskInHand中注入StrategyFactory,并传递决定用于获取Strategy的实现的属性 公共对象对象对象{ strategyFactory.getStrategyobj.getsomething.task; } 你可以创建一个战略工厂 公共级战略工厂{ @注入 //战略一在这里实施 私人战略一; @注入 //策略二在这里实施 私人战略二; 公共策略获取策略字符串{ 如果某物,等于某个条件{ 返回策略一; }否则{ 返回策略二; } } } 在taskInHand中注入StrategyFactory,并传递决定用于获取Strategy的实现的属性 公共对象对象对象{ strategyFactory.getStrategyobj.getsomething.task; }