基于注释值类型的自动装配 bean

Autowired bean based on annotation value type

我有以下 classes:

public abstract class Animal {
    public abstract void call();
}

public class Dog extends Animal {
    @Override
    public void call() {
        System.out.println("Dog was called");
    }
}

public class Cat extends Animal {
    @Override
    public void call() {
        System.out.println("Cat was called");
    }
}

public @interface AnimalAnnotation {
    AnimalType value() default AnimalType.DOG;
}

public enum AnimalType {
    DOG,
    CAT
}

在配置中class我正在为两种类型的 Animal 继承者创建一个 bean:

@Configuration
public class AnimalConfiguration {

    @Bean
    public Animal initDog() {
       return new Dog();
    }
    
    @Bean
    public Animal initCat() {
       return new Cat();
    }
}

我的目的是自动装配一个具有动态类型的 bean,如下所示:

public class Main {
    @Autowired
    @AnimalAnnotation(AnimalType.CAT)
    private Animal animal; // the instance should be the Cat one
    public void perform() {
        animal.call(); // In the console we should see "Cat was called".
    }
}

这是描述我的意图的示例代码,它可能是错误的。 这可以实施吗?正确的方法是什么?

我认为最简单的方法是使用 @Qualifier 注释,例如:

@Autowired
@Qualifier("initDog")

使用 @Qualifier 怎么样?那可能行得通。你必须给你的豆子起一个像

这样的名字
@Bean("cat")
public Animal initCat() {
    return new Cat();
}

然后在自动装配时你会:

@Autowired
@Qualifier("cat")
private Animal animal;