当前位置: 首页 > 知识库问答 >
问题:

@Autowired在 setter 函数上不查看属性名称(就像 XML 中的自动连线一样)

诸葛利
2023-03-14

我正在从 XML 转到注释。

我有界面类型的房子和我的,类类型的房子和我的。斯普林将一个“我的Impl”实例注入到“鼠标优化”实例中,

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

因此< code>HouseImpl中的属性称为< code>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格式的,那么房屋配置中有自动连线=“byName”,并且没有@Autowired注释,则注入bean my2,因为属性名称是my2setMy2是方法)。但是当我们使用注释bean my时,会被注入,因为setMy2的参数的名称是my

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

共有2个答案

曹昊焱
2023-03-14

你的代码是这样的

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

当你写注释@Autow的时候,它会取一个名为setXXX的bean……这里XXX是My2。

因此,注入了id为< code>my2的bean。以便将id为的bean指定为< code>my user @Qualifier批注。

@Autowired
@Qualifier("my")
public void setMy2(My my) {
    this.my = my;
}
杜茂
2023-03-14

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

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

 类似资料:
  • 只是在Spring4.3中从基于xml的配置迁移到基于java的配置。 另外,我尽量不在所有类的所有字段中添加@Autowired注释。这太多了,无法改变。 我现在的问题是:如何通过名称告诉组件扫描到autowire found bean?

  • 我有一个表单,它有一组单选按钮,我正在用php将选中按钮的值发送到另一个页面。表单具有添加另一组相同单选按钮的选项,所以如果我使用以下给出name属性的方法: 并添加上述的克隆, 这将给我每个输入的值,这将总共4。我试图使用括号递增方法,但仍保留返回选中的单选按钮值的功能。 所以我的问题是,有没有一种方法可以使用方括号对name属性进行自动递增,但是当将值发送到php时,确保每个div单选按钮分组

  • 从一个对象的自身(是否继承可选)可枚举属性返回一个函数属性名称数组。 使用 Object.keys(obj) 来迭代对象的自身属性。 如果 inherited 是 true ,则使用 Object.get.PrototypeOf(obj) 来获得对象的继承属性。 使用 Array.filter() 只保留那些函数的属性。 省略第二个参数 inherited,默认情况下不包含继承的属性。 const

  • 我需要使用属性名称替换xml文件中的属性值。 前任: 我有一个替换此值的目标。i、 e“默认值”。如果用户为属性测试名称指定了错误的值,则可以多次运行此目标。用户可以使用正确的值重试运行目标。因此,我不能使用正则表达式替换。我只能依靠物业名称。有没有一种方法可以在ant中使用属性值的名称来替换属性值?

  • 问题内容: 我很好奇知道这样的代码之间有什么区别: 和这样的代码: 问题答案: 要自动装配Bean时使用注释。不限于二传手。它也可以与构造函数和字段一起使用。如果在字段上使用批注,则该字段将自动与具有匹配数据类型的bean连接。 检查是否设置了特定属性。如果某个字段已使用批注注释,并且未设置该字段,则将得到。 编辑:如’kryger’所指出:用注释的字段也是有效的(除非您将其必需的参数显式设置为f

  • 我不太清楚kotlin是如何管理属性名和主构造函数参数名的。如果我写了相同的属性名和参数名,那么kotlin编译器会给出一个错误。 它给出了这个错误。 但是,当我更改属性的名称或更改主构造函数的参数名称时,代码将工作并编译。 这将工作或编译罚款。 这背后的原因是什么?为什么主构造函数的参数名和属性名不能相同?