Spring 按名称注释

Spring Annotations by name

我有一个与 Spring 注释相关的问题。在我的(学习)项目中,我定义了两个 class 和另一个具有两个属性的 class,这两种类型各有一个。 为了生成错误,我在 XML 中定义了两个相同 class 类型的 bean,并且在 setter 方法中使用了 @Autowired 注释。像这样:

<bean id="classA" class="beans.ClassA"></bean>
<bean id="otherclassA" class="beans.ClassA"></bean>
<bean id="classB" class="beans.ClassB"></bean>
public class UpperClass{
   private ClassA classA;
   private ClassB classB;

   @Autowired 
   public void setClassA(ClassA classA){this.classA = classA}
   @Autowired 
   public void setClassB(ClassB classB){this.classB = classB}

   /* .
      .
      .
    */
}

在主要 class 中,我获得了该 bean 的 applicationcontext 实例,并打印覆盖 toString 方法的属性的内容,这是一个简单的测试。 我读过 Spring Autowired 注释按类型查找 bean,因此测试应该会失败,因为定义了两个 ClassA class bean,但它可以工作。 它也可以使用 @Resource 注释而不使用其中的任何名称。

我正在使用 Spring 版本 4。 我已将 bean 的 ID 更改为与 class/setters 名称不匹配,但它失败了,正如预期的那样。

谁能告诉我为什么,或者我做错了什么? Spring 如果按类型找不到 beans,是否按名称查找?

Spring 将查看方法参数名称以解决当有多个 bean 与所需类型匹配时的歧义。在我看来,它太神奇了,也是避免 @Autowired 的另一个原因。如果您最终使用(或不得不处理其他人的使用)这种行为,IntelliJ 的 Spring 插件可以很好地确定哪个 bean 将实际注入到自动装配站点。