歡迎移步博客查看-http://futaosmile.oschina.io/coder957
基于XMl的DI
1.設(shè)值注入
2.構(gòu)造注入
3.p命名空間設(shè)值注入
4.c命名空間構(gòu)造注入
設(shè)值注入
調(diào)用屬性的set方法,使用
<property name="name" value="FutaoSmile"/>
設(shè)值注入
環(huán)境搭建 -- 屬性需要set方法,類不需要構(gòu)造方法
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)
}
}
輸出結(jié)果
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">
<!--設(shè)值注入,實際上是通過調(diào)用set方法實現(xiàn)-->
<property name="name" value="FutaoSmile"/>
<property name="age" value="18"/>
</bean>
</beans>
測試結(jié)果:
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">
<!--設(shè)值注入,實際上是通過調(diào)用set方法實現(xiàn)-->
<!-- 即:property標(biāo)簽調(diào)用到的是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>
測試結(jié)果
Student{name='FutaoSmile', age=18, school=School{schoolName='Ecjtu'}}
基于XMl的DI-構(gòu)造注入
直接調(diào)用帶參構(gòu)造器 - 使用
<constructor-arg name="0" value="李四"/>
構(gòu)造注入
環(huán)境搭建 -- 屬性不需要set方法,類需要帶參的構(gòu)造方法
Student類
package gouzaoDI;
/**
* Created by futao on 2017/10/10.
*/
public class Student {
private String name;
private int age;
private School school;
/**
* 帶參構(gòu)造器
*
* @param name 姓名
* @param age 年齡
* @param school 學(xué)校
*/
public Student(String name, int age, School school) {
this.name = name;
this.age = age;
this.school = school;
}
/**
* 無參構(gòu)造器
*/
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;
/**
* 帶參構(gòu)造方法
*
* @param schoolName 學(xué)校名稱
*/
public School(String schoolName) {
this.schoolName = schoolName;
}
/**
* 無參構(gòu)造方法
*/
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">
<!--構(gòu)造注入方式1,用index,實際上是通過構(gòu)造方法注入,index表示構(gòu)造方法的參數(shù)索引-->
<!--<constructor-arg index="0" value="李四"/>-->
<!--<constructor-arg index="1" value="18"/>-->
<!--<constructor-arg index="2" ref="school"/>-->
<!--構(gòu)造注入方式2,用name-->
<!--<constructor-arg name="name" value="李四"/>-->
<!--<constructor-arg name="age" value="18"/>-->
<!--<constructor-arg name="school" ref="school"/>-->
<!--構(gòu)造注入方式3,省略index和name,但是這樣要保證順序與構(gòu)造方法中參數(shù)的順序是一樣的-->
<constructor-arg value="李四"/>
<constructor-arg value="18"/>
<constructor-arg ref="school"/>
</bean>
<bean id="school" class="gouzaoDI.School">
<constructor-arg index="0" value="華東交通大學(xué)"/>
</bean>
</beans>
測試
/**
* 構(gòu)造注入- 通過類的帶參構(gòu)造方法
*/
@Test
fun test4gouzaoDI() {
val xml = ClassPathXmlApplicationContext("applicationContextGouzaoDI.xml")
val student = xml.getBean("student") as gouzaoDI.Student
println(student)
}
結(jié)果
Student{name='李四', age=18, school=School{schoolName='華東交通大學(xué)'}}
P名字空間設(shè)值注入 p:schoolName="East China JiaoTong University"
實際上是通過屬性的set方法實現(xiàn)的,所以如果要通過p名字空間進(jìn)行設(shè)只注入的屬性,需要為該屬性設(shè)置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名字空間設(shè)值注入的原理其實是通過屬性的set方法實現(xiàn)的,通過追蹤代碼可以出來-->
<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命名空間設(shè)值注入
*/
@Test
fun test4pNamespaceDI() {
val xml = ClassPathXmlApplicationContext("applicationContextPnamespaceDI.xml")
val student = xml.getBean("student") as PnamespaceDI.Student
println(student)
}
結(jié)果
Student{name='麻子', age=18, school=School{schoolName='East China Jiao Tong University'}}
c名字空間構(gòu)造注入 - c:schoolName="華東交通大學(xué)"
添加約束xmlns:c="http://www.springframework.org/schema/c"
原理:c名字空間構(gòu)造注入,原理實際上是通過類的構(gòu)造方法實現(xiàn)的,所以要使用c名字空間注入就需要為類添加帶參的構(gòu)造方法
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名字空間設(shè)值注入的原理其實是通過屬性的set方法實現(xiàn)的,通過追蹤代碼可以出來-->
<!--<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名字空間構(gòu)造注入,原理實際上是通過類的構(gòu)造方法實現(xiàn)的-->
<bean id="student" class="PnamespaceDI.Student" c:name="coder" c:age="18" c:school-ref="school"/>
<bean id="school" class="PnamespaceDI.School" c:schoolName="華東交通大學(xué)"/>
</beans>
測試結(jié)果:
Student{name='coder', age=18, school=School{schoolName='華東交通大學(xué)'}}