Spring使用xml配置文件创建对象时的执行顺序
先看看Student类:
package com.bjpowernode.ba02;
public class Student {
private String name;
private int age;
//声明一个引用类型
private School school;
public Student() {
System.out.println("spring会调用类的无参数构造方法创建对象");
}
// 包名.类名.方法名称
// com.bjpowernode.ba02.Student.setName()
public void setName(String name) {
System.out.println("setName:"+name);
this.name = name;
}
public void setAge(int age) {
System.out.println("setAge:"+age);
this.age = age;
}
public void setSchool(School school) {
System.out.println("setSchool:"+school);
this.school = school;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}
以及School类:
package com.bjpowernode.ba02;
public class School {
private String name;
private String address;
public School(){System.out.println("spring会调用School类的无参构造方法创建对象");}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
再看看配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--声明student对象
注入:就是赋值的意思
简单类型: spring中规定java的基本数据类型和String都是简单类型。
di:给属性赋值
1. set注入(设值注入) :spring调用类的set方法, 你可以在set方法中完成属性赋值
1)简单类型的set注入
<bean id="xx" class="yyy">
<property name="属性名字" value="此属性的值"/>
一个property只能给一个属性赋值
<property....>
</bean>
2) 引用类型的set注入 : spring调用类的set方法
<bean id="xxx" class="yyy">
<property name="属性名称" ref="bean的id(对象的名称)" />
</bean>
-->
<bean id="myStudent" class="com.bjpowernode.ba02.Student" >
<property name="name" value="李四" />
<property name="age" value="26" />
<!--引用类型-->
<property name="school" ref="mySchool" /><!--setSchool(mySchool)-->
</bean>
<!--声明School对象-->
<bean id="mySchool" class="com.bjpowernode.ba02.School">
<property name="name" value="北京大学"/>
<property name="address" value="北京的海淀区" />
</bean>
</beans>
最后看测试类:
package com.bjpowernode;
import com.bjpowernode.ba02.School;
import com.bjpowernode.ba02.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Date;
public class MyTest02 {
@Test
public void test01(){
System.out.println("=====test01========");
String config="ba02/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
//从容器中获取Student对象
Student myStudent = (Student) ac.getBean("myStudent");
System.out.println("student对象="+myStudent);
}
}
测试结果:
分析:
当测试类读配置文件的时候,读到这儿
<bean id="myStudent" class="com.bjpowernode.ba02.Student" >
<property name="name" value="李四" />
<property name="age" value="26" />
<!--引用类型-->
<property name="school" ref="mySchool" /><!--setSchool(mySchool)-->
</bean>
读到<bean id="myStudent" class="com.bjpowernode.ba02.Student" >
调用Student类的无参构造方法,因此就得到了测试结果的第一句输出。然后按我们的逻辑,本来是先
<property name="name" value="李四" />
<property name="age" value="26" />
调用set()方法设置注入,此时就会输出我们在Student类写的set()方法中的输出语句,但是测试结果第二行显示的却是
<property name="school" ref="mySchool" /><!--setSchool(mySchool)-->
调用School类的无参构造方法,然后输出里面的语句,最后再输出我们在Student类写的set()方法中的输出语句。
因此我们得出结论:
在配置文件利用bean标签创建对象的顺序是:
1.bean中调用的所有无参构造方法。
2.bean中调用的set()方法。