自动装配不会为同一类型的多个bean抛出异常

时间:2015-08-10 15:23:05

标签: java spring

我正在开发基本的@Autowired程序,我有2个班AlphaBeta。此处Alpha使用Beta依赖于@Autowired

在Spring配置文件中,我为类Beta类型创建了多个bean,所以当它尝试在Alpha类中注入依赖项时,我期待Spring的异常,因为有2个Beta bean而不是1但是在我的程序中,我没有任何例外,它工作得很好。

这是我的代码:

Alpha.java

public class Alpha {
    @Autowired
    private Beta beta;

    public Alpha() {
        System.out.println("Inside Alpha constructor.");
    }

    @Override
    public String toString() {
        return "Alpha [beta=" + beta + "]";
    }

}

Beta.java

public class Beta {
    public Beta() {
        System.out.println("Inside Beta constructor.");
    }

    @Override
    public String toString() {
        return "This is Beta";
    }
}

弹簧-config.xml中

<beans>

   <context:annotation-config/>

   <bean id="alpha" class="Alpha">
   </bean>

   <bean id="beta" class="Beta">
   </bean>

   <bean id="beta1" class="Beta">
   </bean>

   <bean id="beta2" class="Beta">
   </bean>

</beans>

主程序:

public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("beans.xml");

      Alpha alpha = (Alpha) context.getBean("alpha");

      System.out.println(alpha);
   }

这是输出:

Inside Alpha constructor.
Inside Beta constructor.
Inside Beta constructor.
Inside Beta constructor.
Alpha [beta=This is Beta]

3 个答案:

答案 0 :(得分:7)

按名称自动装配。您有三个Beta1类型的bean,名为betabeta1beta2。您的字段名为beta。 Spring将使用它作为提示来查找相应的bean。

如果您将字段命名为

@Autowired
private Beta whatever;

对Spring没有(有用的)提示,它将无法选择合适的bean。

在Spring文档中并不完全明显,你必须从各个章节中推断它。

来自chapter concerning @Autowired

中的注释
  

如果您打算按名称表达注释驱动的注入,请不要   主要使用@Autowired,即使技术上能够引用   通过@Qualifier值到bean名称。相反,使用JSR-250   @Resource注释,在语义上定义以标识a   特定目标组件的唯一名称,具有声明的类型   与匹配过程无关。

对于@Qualifier值(或者更确切地说是缺少@Qualifier

  

对于后备匹配,bean名称被视为默认限定符值

然后从chapter on @Resource

  

如果[{1}}注释]中没有明确指定名称,则默认名称来自   字段名称或setter方法。 如果是某个字段,则需要   字段名称;在setter方法的情况下,它采用bean属性   名。

答案 1 :(得分:0)

Here是使用@Autowired@Inject@Resource注释的Spring bean解析机制的非常好的摘要。

由于注入的bean的默认名称是字段的名称,因此注入了bean beta

答案 2 :(得分:0)

@Autowired Beta beta正在寻找名为&#34; beta&#34;的bean。那就是春豆工厂。因此不存在这样的问题