@Autowired注释

时间:2013-01-31 06:30:50

标签: spring

我写了一个小代码来检查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的行为。

3 个答案:

答案 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]。