如何使用Spring注解动态地将多个bean注入到单个引用变量中
如何使用Spring注解动态地将多个bean注入到单个引用变量中
我有一个接口A.java和3个实现了A.java接口的类,分别命名为B.java、C.java和D.java。现在我正在尝试像这样注入bean。
接口A{} @Component @Scope("request") class B implements A{ //...... } @Component @Scope("request") class C implements A{ //..... } @Component @Scope("request") class D implements A{ } class Implementation{ @Autowired public A obj; @Autowired private BeanFactory beanFactory; String[] beans = {"B","C","D"}; //实际上这些在我的情况下是从数据库中获取的 for(String beanName : beans){ obj = (A)beanFactory.getBean(beanName); ....//调用特定bean类的某些方法 } }
它显示错误消息:"找不到唯一的bean:包含多个beans["B","C","D"]"。
如果我在XML文件中配置这些bean,它可以正常工作,但我不想使用XML配置。
如何使用Spring注解解决这个问题?
问题的原因是使用@Autowired注解时,它默认会根据类型进行注入,而变量的类型是A,所以很难确定究竟应该注入哪个bean,B、C还是D。
解决方法是使用@Resource注解,它可以根据名称进行注入。或者直接添加@Qualifier注解。
具体的解释可以参考这里:Difference between @Qualifier and @Resource。
以下是代码示例:
public class SomeClass { @Autowired private A bean; // ... }
改为:
public class SomeClass { @Resource private A bean; // ... }
或者:
public class SomeClass { @Autowired @Qualifier("beanB") private A bean; // ... }
这样就可以动态地将多个bean注入到同一个被引用的变量中了。