在spring中,如果同时有构造注入和设值(set)注入,优先使用哪个?

当Spring中的类同时存在构造注入和设值注入时,构造注入的优先级高于设值注入。若两者注入相同属性,最终值为set注入的值;若不同,则set注入的属性为set值,其余为构造注入或null。这是由于在Java对象创建过程中,构造函数先于set方法执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同时有构造注入和set注入,那就是类中同时有有参构造setXXX()方法
类定义:

public class Injection {
    private String name;
    private Integer age;
    
    public Injection(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public Injection(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Injection{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

第一种情况:有参构造注入(全参)+一个set注入

bean.xml

 <bean id="injection" class="com.beaninjection.Injection">
        <constructor-arg name="name" value="李四"></constructor-arg>
        <constructor-arg name="age" value="20"></constructor-arg>
        <property name="name" value="张三"></property>
    </bean>

结果:name值为set注入的值,age为有参构造的值
在这里插入图片描述

第二种情况:有参构造注入(非全参)+一个set注入,两个注入同一个属性

<bean id="injection1" class="com.beaninjection.Injection">
        <constructor-arg name="name" value="李四"></constructor-arg>
        <property name="name" value="张三"></property>
    </bean>

结果:name值为set注入的值,age为null
在这里插入图片描述

第三种情况:有参构造注入(非全参)+一个set注入,两个注入不同的属性

<bean id="injection2" class="com.beaninjection.Injection">
        <constructor-arg name="name" value="李四"></constructor-arg>
        <property name="age" value="22"></property>
    </bean>

结果:name值为有参构造注入,age值为set注入
在这里插入图片描述

第四种情况:全set注入+有参构造注入(非全参)

<bean id="injection3" class="com.beaninjection.Injection">
        <property name="name" value="张三"></property>
        <property name="age" value="22"></property>
        <constructor-arg name="name" value="李四"></constructor-arg>
    </bean>

结果:name值为set注入,age值也为set注入。
在这里插入图片描述

“综上所述”

构造注入优先级比set注入高,所以同时存在时并且对同一个属性注入时,最后的值会是set注入的值,因为构造注入的值会被set注入的值覆盖,不是同时注入同一个属性时,则set注入的属性为set注入的值,其他属性为构造注入的值或null(构造也没注入)。
其实也不难理解,毕竟在java类中,创建一个对象不就是先用构造函数嘛。。。。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值