[Js-Spring]基於 XML 的 DI
註入分類
(1)設值註入:先調用 Bean 的無參構造函數,然後通過 setter 方法傳入被調用者的實例。
<!-- bean definitions here --> <bean id="mySchool" class="com.neu.di01.School"> <property name="sname" value="neu"></property> </bean> <bean id="myStudent" class="com.neu.di01.Student"> <property name="name"value="js"></property> <property name="age" value="23"></property> <property name="school" ref="mySchool"></property> </bean>
註:對於其他 Bean 對象的引用,除了<bean/>標簽的 ref 屬性外,還可以使用 <ref/> 標簽
(2)構造註入:在構造調用者實例的同時,完成了被調用者的實例化。即使用構造器設置依賴關系
<constructor-arg> 標簽中用於指定參數的屬性:
name:指定參數名稱
index:指明該參數對應構造器的第幾個參數,從0開始,不過該屬性可以不需要,但是需要註意,若參數類型相同,或之間有包含關系,則需要保證賦值順序要與構造器中的參數順序一致
另外,type屬性可用於指定類型,基本類型直接寫類型關鍵字即可,非基本類型需要寫全限定性類名
<!-- bean definitions here --> <bean id="mySchool" class="com.neu.di02.School"> <property name="sname" value="neu"></property></bean> <bean id="myStudent" class="com.neu.di02.Student"> <constructor-arg name="name" value="js"></constructor-arg> <constructor-arg name="age" value="22"></constructor-arg> <constructor-arg name="school" ref="mySchool"></constructor-arg> <!-- <constructor-arg value="js"></constructor-arg> <constructor-arg value="22"></constructor-arg> <constructor-arg ref="mySchool"></constructor-arg> --> <!-- <constructor-arg index="0" value="js"></constructor-arg> <constructor-arg index="1" value="22"></constructor-arg> <constructor-arg index="2" ref="mySchool"></constructor-arg> --> </bean>
(3)特定接口註入:采用了侵入式編程,汙染了代碼,幾乎不用
命名空間註入(了解)
對於設值註入和構造註入,除了使用 <property/>或<constructor-arg/>標簽外,還可以使用命名空間註入的方式,讓註入的值以<bean/>標簽屬性的方式出現。根據註入實現方式的不同,分別以 p 命名空間和 c 命名空間註入。
p 命名空間註入:采用設值註入,需要相應的 setter 方法
c 命名空間註入:采用構造註入,需要相應的構造器
(1)p 命名空間註入
采用約束
xmlns:p="http://www.springframework.org/schema/p"
<!-- bean definitions here --> <bean id="mySchool" class="com.neu.di03.School" p:sname="北京大學"></bean> <bean id="myStudent" class="com.neu.di03.Student" p:name="張三" p:age="22" p:school-ref="mySchool"></bean>
(2)c 命名空間註入
采用約束
xmlns:c="http://www.springframework.org/schema/c"
<!-- bean definitions here --> <bean id="mySchool" class="com.neu.di04.School"> <property name="sname" value="清華大學"></property> </bean> <bean id="myStudent" class="com.neu.di04.Student" c:name="張三" c:age="22" c:school-ref="mySchool"></bean>
集合屬性註入
分別為數組,List,Set,Map,Properties註入值,例子如下,
School.java
package com.neu.di05; public class School { private String sname; public void setSname(String sname) { this.sname = sname; } @Override public String toString() { return "School [sname=" + sname + "]"; } }
Some.java
package com.neu.di05; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class Some { private School[] schools; private List<String> myList; private Set<String> mySet; private Map<String, Object> myMap; private Properties myPros; public void setSchools(School[] schools) { this.schools = schools; } public void setMyList(List<String> myList) { this.myList = myList; } public void setMySet(Set<String> mySet) { this.mySet = mySet; } public void setMyMap(Map<String, Object> myMap) { this.myMap = myMap; } public void setMyPros(Properties myPros) { this.myPros = myPros; } @Override public String toString() { return "Some [schools=" + Arrays.toString(schools) + ", myList=" + myList + ", mySet=" + mySet + ", myMap=" + myMap + ", myPros=" + myPros + "]"; } }
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" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!-- bean definitions here --> <bean id="school1" class="com.neu.di05.School"> <property name="sname" value="清華大學"></property> </bean> <bean id="school2" class="com.neu.di05.School"> <property name="sname" value="北京大學"></property> </bean> <bean id="some" class="com.neu.di05.Some"> <property name="schools"> <array> <ref bean="school1" /> <ref bean="school2" /> </array> </property> <property name="myList"> <list> <value>張三</value> <value>李四</value> </list> </property> <property name="mySet"> <set> <value>北京</value> <value>上海</value> </set> </property> <property name="myMap"> <map> <entry key="QQ" value="123"></entry> <entry key="WeiXin" value="456"></entry> </map> </property> <property name="myPros"> <props> <prop key="地址">遼寧省沈陽市</prop> <prop key="名稱">neu</prop> </props> </property> </bean> </beans>
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" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!-- bean definitions here --> <bean id="school1" class="com.neu.di06.School"> <property name="sname" value="清華大學"></property> </bean> <bean id="school2" class="com.neu.di06.School"> <property name="sname" value="北京大學"></property> </bean> <bean id="some" class="com.neu.di06.Some"> <property name="schools"> <array> <ref bean="school1" /> <ref bean="school2" /> </array> </property> <property name="arrays" value="aaa,bbb"></property> <property name="myList" value="張三s,李四"></property> <property name="mySet" value="北京,上海"></property> <property name="myMap"> <map> <entry key="QQ" value="123"></entry> <entry key="WeiXin" value="456"></entry> </map> </property> <property name="myPros"> <props> <prop key="地址">遼寧省沈陽市</prop> <prop key="名稱">neu</prop> </props> </property> </bean> </beans>
MyTest.java
package com.neu.di05; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { @Test public void test01() { // 加載Spring配置文件,創建Spring容器對象 String resource = "com/neu/di05/applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(resource); // 從容器中獲取指定的Bean對象 Some some = (Some) ac.getBean("some"); System.out.println(some); ((ClassPathXmlApplicationContext) ac).close(); } }
對於域屬性的自動註入
byName 方式自動註入
配置文件中被調用者的 Bean 的 id 值與代碼中調用者 Bean 的屬性名相同時,可以使用 byName 的方式,讓容器自動將被調用者 Bean 註入給調用者 Bean 。
如圖中 id 為 school 的 Bean,正好對應 Student 類中定義的 school 成員變量,在 id 為 myStudent 的 Bean 中直接定義自動註入方式 autowrite=“byName” 即可
byType 方式自動註入
配置文件中被調用者Bean的class屬性指定的類,必須要與代碼中被調用者Bean類的某域屬性同源,即,相同或者具有is-a關系(子類,或者實現類)。同源的被調用者Bean只能有一個,多於一個則會報錯,不知道該匹配哪一個。
[Js-Spring]基於 XML 的 DI