今天在学习 Spring 使用<property>
与<constructor-arg>
标签注入属性时,发现如果同时使用这两种注入方式,不论先后顺序怎么放,都<property>
标签的值起作用,难这两种注入方式存在优先级?
Spring _bean <property>
与<constructor-arg>
优先级问题
我们先来看一下代码
1、这是一个学生类
package com.exec.T2;
//学生类
public class Student {
private String name;
private String sex;
private String address;
public Student(String address) {
this.setAddress(address);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2、这是一个应用类
package com.exec.T2;
//应用类
public class Application {
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public void getMessage() {
System.out.println("姓名:"+this.student.getName()+" ,地址:"+this.student.getAddress());
}
}
3、这是main方法入口类
package com.exec.T2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test_Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext apc=new ClassPathXmlApplicationContext("applicationContext.xml");
Application ap=apc.getBean("application_bean",Application.class);
ap.getMessage();
}
}
4、在启动前我们要配置好我们的配置文件:
在 pom.xml
文件里面添加我们的spring Ioc基础配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
然后在src/nain/resources
文件目录下我们调用applicationContext.xml
配置文件里注入依赖
<bean id="student_bean" class="com.exec.T2.Student">
<property name="name" value="张三"></property>
<property name="sex" value="男"></property>
<property name="address" value="锦绣中华"></property>
<constructor-arg index="0" value="美丽中国"></constructor-arg>
</bean>
<bean id="application_bean" class="com.exec.T2.Application">
<property name="student" ref="student_bean"></property>
</bean>
然后我们运行项目得出结果是 “锦绣中华” (如下)
我们修改一下我们的applicationContext.xml
配置
<bean id="student_bean" class="com.exec.T2.Student">
<property name="name" value="张三"></property>
<property name="sex" value="男"></property>
<constructor-arg index="0" value="美丽中国"></constructor-arg>
<property name="address" value="锦绣中华"></property>
</bean>
<bean id="application_bean" class="com.exec.T2.Application">
<property name="student" ref="student_bean"></property>
</bean>
再次运行,我们会发现结果一模一样(如下)
1、<property>
标签是 setter方法的映射,即我们要使用这个标签那么在类里必须要有对应的 setter方法,否则是无法注入属性值的。
2、<constructor-arg>
标签是构造方法的映射,如果我们没有构造方法一样无法注入属性值。
由此在Spring Ioc容器中如果同时使用这两种方式注入属性值,那么无论先后顺序,Spring Ioc容器应该会优先执行代表构造方法的<constructor-arg>
标签再执行代表setter方法的<property>
标签。