如何使用Spring注解动态地将多个bean注入到单个引用变量中

8 浏览
0 Comments

如何使用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注解解决这个问题?

0
0 Comments

问题的原因是使用@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注入到同一个被引用的变量中了。

0