一、註入分類 Bean實例在調用無參構造器創建空值對象後,就要對Bean對象的屬性進行初始化。初始化是由容器自動完成的,稱為註入。根據註入方式的不同,常用的有兩類:設值註入、構造註入、實現特定介面註入。由於第三種方式採用侵入式編程,污染代碼,所以幾乎不用。 1、設值註入 2、構造註入 二、命名空間註 ...
一、註入分類
Bean實例在調用無參構造器創建空值對象後,就要對Bean對象的屬性進行初始化。初始化是由容器自動完成的,稱為註入。根據註入方式的不同,常用的有兩類:設值註入、構造註入、實現特定介面註入。由於第三種方式採用侵入式編程,污染代碼,所以幾乎不用。
1、設值註入
設值註入是指,通過setter方法傳入被調用者的實例。這種註入方式簡單、直觀,因而在Spring的依賴註入中大量使用。
關於設值註入舉個簡單的例子:
分別創建一個學校類(School):
/** * 學校類 * * @author Root */ public class School { private String name; public void setName(String name) { this.name = name; } @Override public String toString() { return "School [name=" + name + "]"; } }
學生類(Student):
/** * 學生類 * * @author Root */ public class Student { private String name; private int age; // 對象屬性,也叫做域屬性 private School school; public Student() { super(); } public void setName(String name) { System.out.println("執行setName()"); this.name = name; } public void setAge(int age) { System.out.println("執行setAge()"); this.age = age; } public void setSchool(School school) { this.school = school; } @Override public String toString() { return "Student [name=" + name + ", 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"> <!-- 註冊School --> <bean id="school" class="com.ietree.spring.basic.di.setter.School"> <property name="name" value="北京大學"></property> </bean> <!-- 註冊Student --> <bean id="student" class="com.ietree.spring.basic.di.setter.Student"> <property name="name" value="李華"></property> <property name="age" value="20"></property> <!-- 域屬性註入使用ref --> <property name="school" ref="school"></property> </bean> </beans>
註意:如果對象中包含有另外的對象引用,則需要使用ref,而不能使用value。
測試:
@Test public void test01(){ String resource = "com/ietree/spring/basic/di/setter/applicationContext.xml"; ApplicationContext ctx = new ClassPathXmlApplicationContext(resource); Student student = (Student) ctx.getBean("student"); System.out.println(student); }
程式輸出:
執行setName()
執行setAge()
Student [name=李華, age=20, school=School [name=北京大學]]
2、構造註入
構造註入,顧名思義就是通過構造方法註入,舉個簡單的例子:
創建一個學校類(School):
/** * 學校類 * * @author Root */ public class School { private String name; public void setName(String name) { this.name = name; } @Override public String toString() { return "School [name=" + name + "]"; } }
學生類(Student):
/** * 學生類 * * @author Root */ public class Student { private String name; private int age; // 對象屬性,也叫做域屬性 private School school; /*public Student() { super(); }*/ // 代參構造器 public Student(String name, int age, School school) { super(); this.name = name; this.age = age; this.school = school; } public void setName(String name) { System.out.println("執行setName()"); this.name = name; } public void setAge(int age) { System.out.println("執行setAge()"); this.age = age; } public void setSchool(School school) { this.school = school; } @Override public String toString() { return "Student [name=" + name + ", 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"> <!-- 註冊School --> <bean id="school" class="com.ietree.spring.basic.di.constructor.School"> <property name="name" value="北京大學"></property> </bean> <!-- 註冊Student --> <!-- 方式一 --> <!-- <bean id="student" class="com.ietree.spring.basic.di.constructor.Student"> <constructor-arg index="0" value="李華"/> <constructor-arg index="1" value="20"/> <constructor-arg index="2" ref="school"/> </bean> --> <!-- 方式二 --> <!-- <bean id="student" class="com.ietree.spring.basic.di.constructor.Student"> <constructor-arg value="李華"/> <constructor-arg value="20"/> <constructor-arg ref="school"/> </bean> --> <!-- 方式三:推薦--> <bean id="student" class="com.ietree.spring.basic.di.constructor.Student"> <constructor-arg name="name" value="李華"/> <constructor-arg name="age" value="20"/> <constructor-arg name="school" ref="school"/> </bean> </beans>
個人強烈推薦使用方式三,因為這樣的配置方式不會帶來歧義,關鍵是可讀性比強兩者要強。
測試:
@Test public void test01(){ String resource = "com/ietree/spring/basic/di/constructor/applicationContext.xml"; ApplicationContext ctx = new ClassPathXmlApplicationContext(resource); Student student = (Student) ctx.getBean("student"); System.out.println(student); }
程式輸出:
Student [name=李華, age=20, school=School [name=北京大學]]
二、命名空間註入
三、集合屬性註入
四、對於域屬性的自動註入
五、使用SPEL註入
六、使用內部Bean註入
七、使用同類抽象Bean註入
八、使用異類抽象Bean註入
九、為應用指定多個Spring配置文件