同时有构造注入和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类中,创建一个对象不就是先用构造函数嘛。。。。。。