我正在开发基本的@Autowired程序,其中有2个类AlphaBeta。这里Alpha使用Beta@Autowired有依赖性。

在spring配置文件中,我为Beta类创建了1个以上的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";
    }
}

spring-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]

最佳答案

它按名称自动接线。您有三种类型为Beta1的bean,分别称为betabeta1beta2。您的字段名为beta。 Spring将以此为提示来查找相应的bean。

如果您命名自己的领域

@Autowired
private Beta whatever;

Spring不会有任何(有用的)提示,并且它将无法选择合适的bean。

在Spring文档中并不是很明显,您必须从各个章节中进行推断。

chapter concerning @Autowired 中的注释

如果要按名称表示注释驱动的注入,请不要
主要使用@Autowired,即使在技术上能够引用
通过@Qualifier值转换为bean名称。而是使用JSR-250
@Resource注释
,在语义上定义为标识一个
具有唯一名称的特定目标组件,具有声明的类型
与匹配过程无关。

对于 @Qualifier 值(或者缺少@Qualifier)

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

然后从chapter on @Resource

如果未在[@Resource批注]中明确指定名称,则默认名称源自
字段名称或设置方法。 如果是字段,则需要
字段名
;在使用setter方法的情况下,它具有bean属性
名称。

10-02 03:40
查看更多