基于注释值类型的自动装配 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;
我有以下 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;