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; }