有接口Work
和You
。有实施类型WorkImpl
和YouImpl
以及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;
}
答案 0 :(得分:2)
使用配置方法的自动装配类型很少:
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>
抛出异常不满意的依赖注入
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