使用构造函数自动装配当有多种实现类型时,Spring不会抛出异常

时间:2014-11-20 08:48:53

标签: spring

有接口WorkYou。有实施类型WorkImplYouImpl以及YouImpl2

我使用构造函数autowire在You实例中注入WorkImpl实现实例。

因为有多个You实现类型,我认为Spring会抛出异常。但是Spring实例化了一个实现类型的实例,在我的例子中它是YouImpl。这是我不明白的。

配置文件部分是

<bean 
    id="work" 
    class="my.test.own.spring_book.WorkImpl"
    autowire="constructor"
 >
    <property name="age" value="52"/>
    <property" name="name" value="Foo Bar"></property>
</bean>

<bean
    id="you"
    class="my.test.own.spring_book.YouImpl"
>
</bean>

<bean
    id="you2"
    class="my.test.own.spring_book.YouImpl2"
>
</bean>

WorkImpl有一个构造函数,

public WorkImpl(You you) {
    this.you=you;

}

1 个答案:

答案 0 :(得分:2)

使用配置方法的自动装配类型很少:

  1. 绰号
  2. byType的
  3. 构造
  4. autodetect: - 与byType类似,但type适用于构造函数参数。
  5. Spring容器在XML配置文件中查看autowire属性设置为byType的bean的构造函数。然后,如果属性的类型与配置文件中的一个bean名称匹配,则会尝试匹配并连接属性。

    <bean id="you" class="my.test.own.spring_book.YouImpl">
    </bean>
    
    <bean id="you2" class="my.test.own.spring_book.YouImpl2">
    </bean>
    

    它将与您匹配作为构造函数中使用的参数名称

    public WorkImpl(You you) {
        this.you=you;
    
    }
    

    为了避免这种情况,您可以使用 autowire-candidate =“false”,因此该bean不会参与自动装配

    <!-- This bean will not be injected-->
    <bean id="you" class="my.test.own.spring_book.YouImpl" autowiring-candidate="false">
    </bean>
    
    
    <bean id="you2" class="my.test.own.spring_book.YouImpl2">
    </bean>
    

    以上是您问题的答案。但是我会尝试解释更多,所以如果我忘了,我可以将这个答案用于将来。

    现在假设您没有为bean提供id属性,或者id属性的值与构造函数参数名称不同。

        <bean id="you1" class="my.test.own.spring_book.YouImpl" autowiring-candidate="false">
        </bean>
    
        <bean id="you2" class="my.test.own.spring_book.YouImpl2">
        </bean>
    
    • Spring容器搜索任何类型为You的bean,是的,找到两个。下一步
    • Spring容器会看到任何名称(即id =“you”)的bean。否
    • 抛出异常不满意的依赖注入

      org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'work' defined in class path resource [autowire-contructor.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [my.test.own.spring_book.You]: : No unique bean of type [my.test.own.spring_book.You] is defined: expected single matching bean but found 2: [you1, you2]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException