基于XMl的DI
1.设值注入
2.构造注入
3.p命名空间设值注入
4.c命名空间构造注入
设值注入
调用属性的set方法,使用
<property name="name" value="FutaoSmile"/>
设值注入
环境搭建 -- 属性需要set方法,类不需要构造方法
Bean-Student
/** * Created by futao on 2017/10/10. */ public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
配置文件-applicationContext.xml
<?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"> <bean id="student" class="Student"> </bean> </beans>
测试
import org.junit.Test import org.springframework.context.support.ClassPathXmlApplicationContext /** * Created by futao on 2017/10/10. */ class Mytest { @Test fun forTest() { val xml = ClassPathXmlApplicationContext("applicationContext.xml") val student = xml.getBean("student") as Student println(student) } }
输出结果
Student{name='null', age=0}
修改配置文件applicationContext.xml
<?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"> <bean id="student" class="Student"> <!--设值注入,实际上是通过调用set方法实现--> <property name="name" value="FutaoSmile"/> <property name="age" value="18"/> </bean> </beans>
测试结果:
Student{name='FutaoSmile', age=18}
新建School类
/** * Created by futao on 2017/10/10. */ public class School { private String schoolName; public String getSchoolName() { return schoolName; } public void setSchoolName(String schoolName) { this.schoolName = schoolName; } @Override public String toString() { return "School{" + "schoolName='" + schoolName + '\'' + '}'; } }
School在Student类中作为属性存在
/** * Created by futao on 2017/10/10. */ public class Student { private String name; private int age; private School school; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public School getSchool() { return school; } public void setSchool(School school) { this.school = school; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", school=" + school + '}'; } }
修改配置文件applicationContext.xml注入school属性值
<?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"> <bean id="student" class="Student"> <!--设值注入,实际上是通过调用set方法实现--> <!-- 即:property标签调用到的是set方法 --> <property name="name" value="FutaoSmile"/> <property name="age" value="18"/> <!-- 添加school的引用 --> <property name="school" ref="school"/> </bean> <bean id="school" class="School"> <property name="schoolName" value="Ecjtu"/> </bean> </beans>
测试结果
Student{name='FutaoSmile', age=18, school=School{schoolName='Ecjtu'}}
基于XMl的DI-构造注入
直接调用带参构造器 - 使用
<constructor-arg name="0" value="李四"/>
构造注入环境搭建 -- 属性不需要set方法,类需要带参的构造方法
Student类
package gouzaoDI; /** * Created by futao on 2017/10/10. */ public class Student { private String name; private int age; private School school; /** * 带参构造器 * * @param name 姓名 * @param age 年龄 * @param school 学校 */ public Student(String name, int age, School school) { this.name = name; this.age = age; this.school = school; } /** * 无参构造器 */ public Student() { } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", school=" + school + '}'; } }
School类
package gouzaoDI; /** * Created by futao on 2017/10/10. */ public class School { private String schoolName; /** * 带参构造方法 * * @param schoolName 学校名称 */ public School(String schoolName) { this.schoolName = schoolName; } /** * 无参构造方法 */ public School() { } @Override public String toString() { return "School{" + "schoolName='" + schoolName + '\'' + '}'; } }
配置文件applicationContextGouzaoDI.xml
<?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"> <bean id="student" class="gouzaoDI.Student"> <!--构造注入方式1,用index,实际上是通过构造方法注入,index表示构造方法的参数索引--> <!--<constructor-arg index="0" value="李四"/>--> <!--<constructor-arg index="1" value="18"/>--> <!--<constructor-arg index="2" ref="school"/>--> <!--构造注入方式2,用name--> <!--<constructor-arg name="name" value="李四"/>--> <!--<constructor-arg name="age" value="18"/>--> <!--<constructor-arg name="school" ref="school"/>--> <!--构造注入方式3,省略index和name,但是这样要保证顺序与构造方法中参数的顺序是一样的--> <constructor-arg value="李四"/> <constructor-arg value="18"/> <constructor-arg ref="school"/> </bean> <bean id="school" class="gouzaoDI.School"> <constructor-arg index="0" value="华东交通大学"/> </bean> </beans>
测试
/** * 构造注入- 通过类的带参构造方法 */ @Test fun test4gouzaoDI() { val xml = ClassPathXmlApplicationContext("applicationContextGouzaoDI.xml") val student = xml.getBean("student") as gouzaoDI.Student println(student) }
结果
Student{name='李四', age=18, school=School{schoolName='华东交通大学'}}
P名字空间设值注入 p:schoolName="East China JiaoTong University"
实际上是通过属性的set方法实现的,所以如果要通过p名字空间进行设只注入的属性,需要为该属性设置setter
XML shortcut with the p-namespace
The p-namespace enables you to use the bean element’s attributes, instead of nested
<property/>
elements(property), to describe your property values and/or collaborating beans.
配置文件applicationContextPnamespaceDI.xml
注意:需要添加约束xmlns:p="http://www.springframework.org/schema/p"
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--p名字空间设值注入的原理其实是通过属性的set方法实现的,通过追踪代码可以出来--> <bean id="student" class="PnamespaceDI.Student" p:name="麻子" p:age="18" p:school-ref="school"/> <bean id="school" class="PnamespaceDI.School" p:schoolName="East China JiaoTong University"/> </beans>
测试
/** * p命名空间设值注入 */ @Test fun test4pNamespaceDI() { val xml = ClassPathXmlApplicationContext("applicationContextPnamespaceDI.xml") val student = xml.getBean("student") as PnamespaceDI.Student println(student) }
结果
Student{name='麻子', age=18, school=School{schoolName='East China Jiao Tong University'}}
c名字空间构造注入 - c:schoolName="华东交通大学"
添加约束xmlns:c="http://www.springframework.org/schema/c"
原理:c名字空间构造注入,原理实际上是通过类的构造方法实现的,所以要使用c名字空间注入就需要为类添加带参的构造方法
XML shortcut with the c-namespace
Similar to the the section called “XML shortcut with the p-namespace”, the c-namespace, newly introduced in Spring 3.1, allows usage of inlined attributes for configuring the constructor arguments rather then nested constructor-arg elements.
applicationContextCnamespaceDI.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--p名字空间设值注入的原理其实是通过属性的set方法实现的,通过追踪代码可以出来--> <!--<bean id="student" class="PnamespaceDI.Student" p:name="麻子" p:age="18" p:school-ref="school"/>--> <!--<bean id="school" class="PnamespaceDI.School" p:schoolName="East China JiaoTong University"/>--> <!--c名字空间构造注入,原理实际上是通过类的构造方法实现的--> <bean id="student" class="PnamespaceDI.Student" c:name="coder" c:age="18" c:school-ref="school"/> <bean id="school" class="PnamespaceDI.School" c:schoolName="华东交通大学"/> </beans>
测试结果:
Student{name='coder', age=18, school=School{schoolName='华东交通大学'}}