Joe*_*Joe 0 dependency-injection guice
我创建了Guice绑定注释,允许我根据注释绑定一个类的两个不同实例,例如:
bind(Animal.class).withAnnotation(Cat.class).toInstance(new Animal("Meow"));
bind(Animal.class).withAnnotation(Dog.class).toInstance(new Animal("Woof"));
Run Code Online (Sandbox Code Playgroud)
我希望能够创建一个提供List方法的提供程序方法,该方法是我的一个类的依赖项,但是无法弄清楚如何使用这个注释:
@Provider
List<Animal> provideAnimalList() {
List<Animal> animals = new ArrayList<Animal>();
animals.add(@Cat Animal.class); // No, but this is what I want
animals.add(@Dog Animal.class); // No, but this is what I want
return animals;
}
Run Code Online (Sandbox Code Playgroud)
所以我假设我只能add()在List的方法中使用参数中的注释...但是没有.
我该怎么接近这个?在我看来,简单地对newAnimal类的两个实例更简单,也许这不是如何使用绑定注释.
我很感激在这种情况下最好地使用绑定注释的评论.
谢谢
如果它真的是你想要的,这里有一个有效的解决方案:
public class AnimalModule extends AbstractModule {
@Override
protected void configure() {
bind(Animal.class).annotatedWith(Cat.class).toInstance(new Animal("Meow"));
bind(Animal.class).annotatedWith(Dog.class).toInstance(new Animal("Woof"));
}
@Provides
List<Animal> provideAnimalList(@Cat Animal cat, @Dog Animal dog) {
List<Animal> animals = new ArrayList<Animal>();
animals.add(cat);
animals.add(dog);
return animals;
}
public static void main(String[] args) {
List<Animal> animals = Guice.createInjector(new AnimalModule()).getInstance(Key.get(new TypeLiteral<List<Animal>>() {
}));
for (Animal animal : animals) {
System.out.println(animal);
}
}
}
Run Code Online (Sandbox Code Playgroud)
注释:
@Retention(value = RetentionPolicy.RUNTIME)
@BindingAnnotation
public @interface Cat {
}
Run Code Online (Sandbox Code Playgroud)
输出:
Animal{sound='Meow'}
Animal{sound='Woof'}
Run Code Online (Sandbox Code Playgroud)
但是:
| 归档时间: |
|
| 查看次数: |
5493 次 |
| 最近记录: |