1

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

4

3 回答 3

2

没有定义类型 [org.springexamples.Address] 的唯一 bean:预期的单个匹配 bean 但找到 2:[address1,addres2]..异常即将到来..它显然是对的..所以你必须使用 @Qualifier (your_required_beanid)

例如:@Qualifier("Address1") 那么它将考虑 id 与 address1 bean

于 2013-01-31T07:27:29.770 回答
1

这会给你一个例外,当spring尝试自动处理地址字段时,它不会找到任何具有id地址的bean ...而是具有正确ID的用户Qualifer,因此在自动处理时它会从2 id [address1]中pinck地址的porper对象, 地址2]。

于 2013-01-31T08:44:03.743 回答
1

抛出异常。我敢打赌你做错了什么。我已经测试了你的代码,只是为了百分百确定它会引发异常。

让我们看一下文档

3.4.5.1 自动装配的限制和缺点

容器内的多个 bean 定义可能与要自动装配的 setter 方法或构造函数参数指定的类型匹配。对于数组、集合或 Map,这不一定是问题。然而,对于期望单个值的依赖项,这种歧义不会被任意解决。如果没有唯一的 bean 定义可用,则抛出异常

另外,看看这篇文章

于 2013-01-31T08:38:19.527 回答