@Autowired on setter function不查看属性名称(就像在XML中自动装配一样)

时间:2014-11-24 08:27:01

标签: spring

我正在从XML转向注释。

我有接口类型House和My,类类型为HouseImpl和MyImpl。 Spring将MyImpl实例注入到MouseImpl实例中,

public class HouseImpl implements House
    private My my;
    public My getMy2() {
         return my;
    }
    @Autowired
    public void setMy2(My my) {
        this.my = my;
    }

因此HouseImpl中的属性称为my2

在Spring配置文件中,

<context:annotation-config></context:annotation-config>

<bean 
    id="house" 
    class="....HouseImpl"

>
...
</bean>

<bean
    id="my"
    class="my.test.own.spring_book_annotations.MyImpl"

>
</bean> 

<bean
    id="my2"
    class="my.test.own.spring_book_annotations.MyImpl2"

>
</bean>

如果配置是XML格式,那么autowired="byName"配置中有house,没有@Autowired注释,则会注入bean my2,因为属性名称是my2setMy2是方法)。但是当我们使用注释时,会注入bean my,因为setMy2的参数名称是my

我的问题是为什么@Autowired在setter函数上不会查看属性名称。

2 个答案:

答案 0 :(得分:0)

当在setter上使用@Autowired并且有多个匹配类型时,容器将查看参数名称以查找要注入的bean。在您的情况下,参数是My my,因此将注入my bean。您可以将参数更改为My my2,或使用@Qualifier("my2")注入my2 bean。

如果您想使用字段名称,请在字段本身上放置@Autowired以使用字段注入。

答案 1 :(得分:0)

您的代码就像这样

@Autowired
public void setMy2(My my) {
    this.my = my;
}

当您编写注释@Autowired时,它将使用setXXX名称的bean ....这里XXX是My2。

因此注入了my2 id的bean。 为了指定id为my user @Qualifier注释的bean。

@Autowired
@Qualifier("my")
public void setMy2(My my) {
    this.my = my;
}