java - Guice - 使用两种不同的实现注入(inject)对象

标签 java oop dependency-injection guice

首先我不得不说我尝试用谷歌搜索这个问题的答案,但没有答案解释我的疑虑。 反正, 我想了解的是:

public interface Animal{
 public void makeSound(int times);
}

该接口(interface)有两种不同的实现:

public class Cat implements Animal{
 @Override
 public void makeSound(int times){
   for(int=0;i<times;i++){ 
      this.meow();
   }
 }
}

public class Dog implements Animal{
 @Override
 public void makeSound(int times){
   for(int=0;i<times;i++){ 
      this.wolf();
   }
  }
}

我将使用这些实现,如下例所示:

public class AnimalStateManager {

 @Inject
 private Animal animal;

 public void makeAnimalAct(){
   animal.makeSound(100)
 }

}

更新 1.1 至帖子

我还有一个使用相同“动物”界面的类:

 public class AnimalMakeSoundOnce {

     @Inject
     private Animal animal;

     public void makeSoundOnce(){
       animal.makeSound(1)
     }

    }

所以我的问题是: 1-我如何知道什么实现将被注入(inject)到 AnimalStateManager 中? 2-如果我想强制“AnimalStateManager”上的“动物”对象成为猫怎么办?

更新 1.1 至帖子 3- 如果我想让 AnimalMakeSoundOnce 使用 Dog 实现,而 AnimalStateManager 使用 Cat 实现,该怎么办?

提前致谢

最佳答案

在 Guice 中,您必须实现一个模块(覆盖 AbstractModule 类)并将 Animal 绑定(bind)到特定的实现类。 回答您的问题:

  1. 您当然可以调用animal.getClass()在运行时检查注入(inject)了哪个实现类。但这会打破 IOC 的原则,即无论您使用哪种具体实现都无关紧要。

  2. 要强制 AnimalStateManager 中的 animal 为 cat,您必须编写自己的模块。

    public class AnimalStateModule extends AbstractModule {
    
        @Override
        protected void configure() {
            bind(Animal.class).to(Cat.class);
        }
    }
    

并实例化 AnimalState:

Injector inj = Guice.createInjector(new AnimalStateModule());
final AnimalStateManager ass = inj.getInstance(AnimalStateManager.class);
ass.makeAnimalAct(); // will cause a call to Cat.meow()

关于java - Guice - 使用两种不同的实现注入(inject)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54987906/

相关文章:

java - 单个文件中的多个类

c# - 在过滤器属性中使用 Autofac 进行属性/方法注入(inject)

c# - ASP.NET Core 5 - 如何拥有可选的依赖项?

javascript - Obj ['var' ] 和 Obj.prototype.var 有区别吗?

oop - Matlab相当于调用内部静态类

java - 如何使用控制反转在java中创建即插即用代码?

java - 需要创建一个数组方法,但不确定我是否做对了

java - 如何按参数对数组列表进行排序?

java - 如何在java中正确创建和访问KeyStore来存储加密 key ?

java/scala : Regex for skipping odd number of backslash while splitting a String?