0

我创建了 Guice 绑定注释,允许我根据注释绑定类的两个不同实例,例如:

bind(Animal.class).withAnnotation(Cat.class).toInstance(new Animal("Meow"));
bind(Animal.class).withAnnotation(Dog.class).toInstance(new Animal("Woof"));

我希望能够创建一个提供者方法,该方法提供一个列表,该列表是我的一个类的依赖项,但无法弄清楚如何为此使用注释:

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

所以我假设我只能使用add()List 方法的参数中的注释......但没有。

我应该如何处理这个?在我看来,简单地new使用 Animal 类的两个实例会更简单,也许这不是绑定注释的使用方式。

我很感激在这种情况下最好地使用绑定注释的评论。

谢谢

4

1 回答 1

7

如果它真的是你想要的,这里有一个可行的解决方案:

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

注释:

@Retention(value = RetentionPolicy.RUNTIME)
@BindingAnnotation
public @interface Cat {
}

输出 :

Animal{sound='Meow'}
Animal{sound='Woof'}

但是

  • 不要创建特定的注释,在这种情况下似乎没有必要。改用@Named
  • 您可以考虑使用多重绑定来解决该问题。
于 2012-11-01T11:32:52.480 回答