歡迎移步博客查看-http://futaosmile.oschina.io/coder957
基于XMl的DI
- 匿名Bean
- 匿名內部Bean
- 同類抽象Bean
- 異類抽象Bean
- 多個配置文件-平行關系
- 多個配置文件-包含關系
匿名Bean
沒有id,但是可以通過autowire="byType"找到贮竟。
即:不能通過getBean()得到這個Bean
School類
package Part03.InnerNonameBean;
/**
* Created by futao on 2017/10/12.
*/
public class School {
private String sname;
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "School{" +
"sname='" + sname + '\'' +
'}';
}
}
Student類
package Part03.InnerNonameBean;
/**
* Created by futao on 2017/10/12.
*/
public class Student {
private String sname;
private int age;
private School school;
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
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{" +
"sname='" + sname + '\'' +
", age=" + age +
", school=" + 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屬性,所以是匿名的-->
<bean class="Part03.InnerNonameBean.School">
<property name="sname" value="Ecjtu"/>
</bean>
<bean id="student" class="Part03.InnerNonameBean.Student" autowire="byType">
<property name="sname" value="小王"/>
<property name="age" value="18"/>
</bean>
</beans>
測試
/**
* 匿名類/匿名內部類
*/
@Test
fun test4NonameBean() {
val classPathXmlApplicationContext = ClassPathXmlApplicationContext("applicationContextInnerNonameBean.xml")
val student = classPathXmlApplicationContext.getBean("student") as Part03.InnerNonameBean.Student
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student))
}
結果
{
"sname": "小王",
"age": 18,
"school": {
"sname": "Ecjtu"
}
}
匿名內部Bean
特點:
1.匿名的,所以該bean在配置文件中沒有id屬性,也就不能通過getBean()得到
2.內部的涮帘,該bean被其他bean的屬性標簽包裹,所以也無法通過autowire="byType"得到。所以這個bean只能被這個包裹他的bean所使用
修改配置文件
<?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="Part03.InnerNonameBean.Student">
<property name="sname" value="小王"/>
<property name="age" value="18"/>
<property name="school">
<!--1.這個bean沒有id屬性殉摔,所以是匿名的-->
<!--2.這個bean是在student的school屬性中,所以是內部的-->
<bean class="Part03.InnerNonameBean.School">
<property name="sname" value="Ecjtu"/>
</bean>
</property>
</bean>
</beans>
同類抽象Bean
abstract="true"
Student類
package Part03.SameAbstractBean;
/**
* Created by futao on 2017/10/12.
*/
public class Student {
private String sname;
private int age;
private String school;
private String department;
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
@Override
public String toString() {
return "Student{" +
"sname='" + sname + '\'' +
", age=" + age +
", school='" + school + '\'' +
", department='" + department + '\'' +
'}';
}
}
配置文件
<?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">
<!--傳統(tǒng)方式记焊,代碼大量冗余-->
<bean id="student1" class="Part03.SameAbstractBean.Student">
<property name="sname" value="張三"/>
<property name="age" value="18"/>
<property name="school" value="Ecjtu"/>
<property name="department" value="計算機學院"/>
</bean>
<bean id="student2" class="Part03.SameAbstractBean.Student">
<property name="sname" value="李四"/>
<property name="age" value="38"/>
<property name="school" value="NCDX"/>
<property name="department" value="軟件學院"/>
</bean>
<bean id="student3" class="Part03.SameAbstractBean.Student">
<property name="sname" value="王五"/>
<property name="age" value="68"/>
<property name="school" value="SHJD"/>
<property name="department" value="計算機科學學院"/>
</bean>
<!--同類抽象Bean逸月,抽象的 abstract="true"-->
<bean id="baseStudent" class="Part03.SameAbstractBean.Student" abstract="true">
<property name="school" value="Ecjtu"/>
<property name="department" value="計算機科學"/>
</bean>
<bean id="student1-1" parent="baseStudent">
<property name="age" value="100"/>
</bean>
<bean id="student1-2" parent="baseStudent">
<property name="school" value="NCDX"/>
</bean>
</beans>
測試
/**
* 同類抽象Bean
*/
@Test
fun test4SameAbstractBean() {
val classPathXmlApplicationContext = ClassPathXmlApplicationContext("applicationContextSameAbstractBean.xml")
// val student1 = classPathXmlApplicationContext.getBean("student1") as Part03.SameAbstractBean.Student
// println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student1))
// val student2 = classPathXmlApplicationContext.getBean("student2") as Part03.SameAbstractBean.Student
// println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student2))
// val student3 = classPathXmlApplicationContext.getBean("student3") as Part03.SameAbstractBean.Student
// println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student3))
val baseStudent = classPathXmlApplicationContext.getBean("baseStudent") as Part03.SameAbstractBean.Student
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(baseStudent))
val student11 = classPathXmlApplicationContext.getBean("student1-1") as Part03.SameAbstractBean.Student
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student11))
val student12 = classPathXmlApplicationContext.getBean("student1-2") as Part03.SameAbstractBean.Student
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student12))
}
結果
{
"sname": null,
"age": 0,
"school": "Ecjtu",
"department": "計算機科學"
}
{
"sname": null,
"age": 100,
"school": "Ecjtu",
"department": "計算機科學"
}
{
"sname": null,
"age": 0,
"school": "NCDX",
"department": "計算機科學"
}
異類抽象Bean
將一部分bean的某些相同的屬性拿出來,組成一個bean遍膜,這個bean沒有class碗硬,需要標注
abstract="true"
Student類
package Part03.DiffAbstractBean;
/**
* Created by futao on 2017/10/12.
*/
public class Student {
private String name;
private int age;
private String school;
private String department;
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 String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school='" + school + '\'' +
", department='" + department + '\'' +
'}';
}
}
Teacher類
package Part03.DiffAbstractBean;
/**
* Created by futao on 2017/10/12.
*/
public class Teacher {
private String name;
private int wordAge;
private String school;
private String department;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWordAge() {
return wordAge;
}
public void setWordAge(int wordAge) {
this.wordAge = wordAge;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", wordAge=" + wordAge +
", school='" + school + '\'' +
", department='" + department + '\'' +
'}';
}
}
配置文件
<?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-->
<bean id="baseBean" abstract="true">
<property name="school" value="華東交通大學111"/>
<property name="department" value="計算機科學"/>
</bean>
<bean id="student" class="Part03.DiffAbstractBean.Student" parent="baseBean">
<property name="name" value="張三"/>
<property name="age" value="23"/>
<!--<property name="school" value="Ecjtu"/>-->
<!--<property name="department" value="軟件學院"/>-->
</bean>
<bean id="teacher" class="Part03.DiffAbstractBean.Teacher" parent="baseBean">
<property name="name" value="老王"/>
<property name="wordAge" value="18"/>
<!--<property name="department" value="軟件學院"/>-->
<!--<property name="school" value="Ecjtu"/>-->
</bean>
</beans>
測試
/**
* 異類抽象Bean
*/
@Test
fun test4DiffAbstractBean() {
val classPathXmlApplicationContext = ClassPathXmlApplicationContext("applicationContextDiffAbstractBean.xml")
val student = classPathXmlApplicationContext.getBean("student") as Part03.DiffAbstractBean.Student
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student))
val teacher = classPathXmlApplicationContext.getBean("teacher") as Teacher
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(teacher))
}
結果
{
"name": "張三",
"age": 23,
"school": "華東交通大學111",
"department": "計算機科學"
}
{
"name": "老王",
"wordAge": 18,
"school": "華東交通大學111",
"department": "計算機科學"
}
為Spring 配置多個子配置文件-平行關系
多個配置文件,加載的時候加載多個就行
配置文件1
<?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="Part03.ManyChildXmlFileParallel.Student">
<property name="name" value="File1"/>
<property name="age" value="18"/>
<property name="school" value="華東交通大學"/>
<property name="department" value="軟件"/>
</bean>
</beans>
配置文件2
<?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="teacher" class="Part03.ManyChildXmlFileParallel.Teacher">
<property name="name" value="File2"/>
<property name="wordAge" value="28"/>
<property name="department" value="計算機"/>
<property name="school" value="Ecjjtu"/>
</bean>
</beans>
測試
/**
* 為Spring配置多個配置文件-平行關系
*/
@Test
fun test4ManyChildXmlFile() {
//使用通配符*
//val classPathXmlApplicationContext = ClassPathXmlApplicationContext("applicationContextManyChildXmlFile*")
val classPathXmlApplicationContext = ClassPathXmlApplicationContext("applicationContextManyChildXmlFile1.xml", "applicationContextManyChildXmlFile2.xml")
val student = classPathXmlApplicationContext.getBean("student") as Part03.ManyChildXmlFileParallel.Student
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student))
val teacher = classPathXmlApplicationContext.getBean("teacher") as Part03.ManyChildXmlFileParallel.Teacher
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(teacher))
}
結果
{
"name": "File1",
"age": 18,
"school": "華東交通大學",
"department": "軟件"
}
{
"name": "File2",
"wordAge": 28,
"school": "Ecjjtu",
"department": "計算機"
}
為Spring配置多個子配置文件-包含關系
在主配置中使用<import />將子配置文件導入到主配置文件中瓢颅,所以程序只需要加載主配置文件恩尾。
主配置文件
<?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">
<!--導入子配置文件-->
<!--<import resource="applicationContextManyChildXmlFile1.xml"/>-->
<!--<import resource="applicationContextManyChildXmlFile2.xml"/>-->
<!--使用通配符-->
<import resource="applicationContextManyChildXmlFile*.xml"/>
</beans>