我写了一个小代码来检查Spring中的@Autowired注释,这是我的一段代码
public class Address
{
private String street;
private String City;
private String State;
private String Country;
/* getter setter here */
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Customer
{
private String name;
private Address address;
// other getter setter here
@Autowired
public void setAddress(Address address)
{
this.address = address;
}
}
和springexample.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="address1" class="org.springexamples.Address">
<property name="street" value="vihar" />
<property name="city" value="dehradun" />
<property name="state" value="Uttarakhand" />
<property name="country" value="India" />
</bean>
<bean id="addres2" class="org.springexamples.Address">
<property name="street" value="triveni vihar" />
<property name="city" value="dehradun" />
<property name="state" value="Uttarakhand" />
<property name="country" value="India" />
</bean>
<bean id="customer" class="org.springexamples.Customer">
<property name="name" value="deepak" />
</bean>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
</beans>
和主要课程
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AutowiredQualifierTest
{
public static void main(String[] args)
{
ApplicationContext context= new ClassPathXmlApplicationContext("springexample.xml");
Customer cust = (Customer)context.getBean("customer");
System.out.println(cust.getName() + " " + cust.getAddress().getStreet());
}
}
理想情况下它应该显示一个异常,因为它存在两个相同类型的bean,但它拾取了id =“address1”的bean,所以我得到了这个bean的行为。
答案 0 :(得分:2)
没有定义类型为[org.springexamples.Address]的唯一bean:期望的单个匹配bean但找到2:[address1,addres2] ..异常即将来临...它显然是正确的...所以你必须使用@Qualifier(your_required_beanid)
例如: @Qualifier( “地址1”) 然后它会考虑带有address1 bean的id
答案 1 :(得分:1)
抛出异常。我打赌你做错了什么。我已经测试了你的代码,只是为了百分百肯定并且它抛出异常。
让我们来看看documentation:
3.4.5.1自动装配的限制和缺点
容器中的多个bean定义可能与要自动装配的setter方法或构造函数参数指定的类型匹配。对于数组,集合或地图,这不一定是个问题。但是,对于期望单个值的依赖关系,这种模糊性不是任意解决的。 如果没有可用的唯一bean定义,则抛出异常
另外,请查看此post。
答案 2 :(得分:1)
这会给你例外,当spring尝试自动转发地址字段时,它不会找到任何带有id地址的bean ...而是使用具有正确id的用户Qualifer,这样在自动装配时它将ping来自2的porper对象id [address1,address2]。