当前位置: 首页 > 知识库问答 >
问题:

Guice-用两种不同的实现注入对象

朱天逸
2023-03-14

首先,我不得不说,我试着用谷歌搜索这个问题的答案,但没有任何答案可以解释我的怀疑。总之,我想了解的是:

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

此接口有两种不同的实现:

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-我如何知道将向AnimalStateManager注入什么实现?2-如果我想强迫“AnimalStateManager”上的“动物”对象成为猫,该怎么办?

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

提前感谢

共有2个答案

匡旭东
2023-03-14

我认为另一个重要的问题是您将如何使用MakeSound和MakeSoundOne对象。在上面创建的同一个模块中,有许多方法来指定您想要的类型,这两种方法都是描述的绑定注释的方法(https://github.com/google/guice/wiki/BindingAnnotations):

1) 您可以使用Guice提供的@Named注释。您将看到如下所示:

@Override
protected void configure() {
    bind(Animal.class).annotatedWith(Names.named("Cat")).to(Cat.class);
    bind(Animal.class).annotatedWith(Names.named("Dog")).to(Dog.class);
}

然后将用于:

@Inject @Named("Cat") private Animal animal;

在你的MakeSound课程中。

2) 您还可以创建自己的注释(在上面的同一链接中进行了详细描述),这将为您提供使用以下选项的选项:

@Inject @Cat private Animal animal;

在你的MakeSound课程中。大多数情况下,我们坚持使用@Named注释,因为它不需要创建额外的注释接口。

*MakeSound类将通过注入实现吗?您是否需要在您描述的*MakeSound类中切换Dog/Cat实现(即,只想让一只猫喵喵叫一次,反之亦然)?

薛弘壮
2023-03-14

在Guice中,您必须实现一个模块(重写AbstractMoules类),并将动物绑定到特定的实现类。要回答您的问题:

>

  • 您当然可以调用animal.getClass()来检查在运行时注入了哪个实现类。但是这会打破IOC的prinziple,在那里您使用哪个特定的实现并不重要。

    强制动物在你的AnimalStateManager是猫你必须写你自己的模块。

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

    并举例说明动物状态:

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

  •  类似资料:
    • 我正在开发一个现有的Java代码库,该代码库使用Guice进行依赖注入。我有一个新的类 Foo,其中包含一个我想注入的成员字段(bar)。喜欢这个: 然而,有两件事: 使用Foo的注射器无法直接进入 客户端希望使用“new”创建Foo 当客户端执行以下操作时,是否仍然可以将Bar注入Foo对象: 我对DI和Guice非常陌生,不太明白如何在不调用injector.createInstance()的

    • 我们是这样做的: 但是我们有很多类具有as依赖性,我们不想每次创建实例时都添加这些代码。 那么,有没有办法在创建B的实例时自动注入A的实例?

    • 我对Guice的理解是: 构造函数级注入()意味着每次通过

    • 我上了如下的课,效果很好 现在,我没有直接使用EmpService,而是创建了一个接口,EmpService实现了该接口,如下所示。 所以现在我的资源类必须使用接口,但我不确定如何引用它必须使用的实现。 我看到了这个,我不确定我的绑定应该去哪里。(这是我第一个与Guice相关的项目,所以我是一个完全的新手)。 这就是“未绑定com.api.EmpService的实现”出现的错误这完全可以理解,但不

    • 我有两个不同的方法,在两个不同的类中。我希望他们都能阅读同一行输入,并检查不同的内容。一个查找“给我冲杯咖啡”之类的说明,另一个查找不同的关键字,如“请”和“谢谢”(这些影响程序对我的反应): 然后我在我的主字符串中调用它们,只是为了测试它们: 我的控制台显示如下: 我知道发生了什么,但我想不出其他办法。我也尝试过使用同一个扫描仪,不同的字符串,但仍然不起作用。我怎样才能使这两种方法都能读取我的第

    • 问题内容: 可以说我有一个叫做Guice服务的服务,这是它的构造函数 我的代码曾经使用枚举创建它 而且我必须在某处进行工厂实施。像这样 现在,我想使用Guice,我想我想使用FactoryModuleBuilder。 如果我对IPayment的了解不止一种,该怎么办? (例如,CardPayment,CashPayment) 适用于一个 .implement(IPayment.class, Cas