spring 依賴註入詳解
當我們對一個javaBean進行實例化時,在原本的情況下我們會選擇新建一個接口,然後進行實例化,為了進一步降低耦合度我們還會使用工廠模式進行封裝。
例:
當我們想要去造,Chinese、American 時,我們會先去建造接口Human 在用Chinese American 來實現Human接口,同時建立HumanFactoy 在需要對象時 我們可以通過調用HumanFactory 來完成。
簡單點來說我們可以這樣去實現:
1 public Human getHuman(String human){ 2 if (human.equals("Chinese")) { 3 returnnew Chinese(); 4 }else if (human.equals("American")) { 5 return new American() 6 } 7 8 }
之後 我們的 Human 應該可以 speak() ,所以我們的Chinese和American相應的也應該具有屬性 Language .
接下來理所應當的去構建 getter/setter() 方法 或者 在構造方法裏加入 this.language = language 然後在使用時手動調用相應的方法進行初始化。
在這裏Spring 給我們提供了另外一種創建對象的方法。
例:
我們用 spring 的相關配置代替了HumanFactory 來創建對象, 並且我們無需調用Human的相關方法, 只需要在相關文件進行配置,將Human跟Language之間的關系交又外部文件來完成,而不是去調用Human的方法,手動去初始化 Language。
javaBean 不變。
1 public interface Human { 2 public void speak(); 3 }
1 import com.language.Language; 2 public class Chinese implements Human{ 3 private Language lan1;4 private Language lan2; 5 @Override 6 public void speak() { 7 System.out.println("中國人說:"+lan1.kind()); 8 System.out.println("中國人也說:"+ lan2.kind()); 9 } 10 11 public void setLan1(Language lan1) { 12 this.lan1 = lan1; 13 } 14 15 public void setLan2(Language lan2) { 16 this.lan2 = lan2; 17 } 18 }
1 public interface Language { 2 public String kind(); 3 }
1 public class English implements Language{ 2 3 @Override 4 public String kind() { 5 return "英語"; 6 } 7 8 }
1 public class Chinese implements Language{ 2 @Override 3 public String kind() { 4 return "中文"; 5 } 6 }
在我們導入相關spring組件時會在src下自動創建 applicationContext.xml 我們在此做相關部署,將中國人跟中文、英文分別配置,並且設置 lan1為 中文 lan2 為 英文。
如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 7 <!-- 註入chinese對象 --> 8 <bean id="Chinese" class="com.human.Chinese"> 9 <!-- property 元素用來指定需要容器註入的屬性,lan屬性需要容器註入 --> 10 <property name="lan1" ref="chinese"></property> 11 <property name="lan2" ref="english"></property> 12 </bean> 13 <!-- 註入English對象 --> 14 <bean id="english" class="com.language.English"></bean> 15 <!-- 註入chinese對象 --> 16 <bean id="chinese" class="com.language.Chinese"></bean> 17 </beans>
測試代碼如下:
1 public class Test { 2 public static void main(String[] args) { 3 4 ApplicationContext ctx = new FileSystemXmlApplicationContext("/src/applicationContext.xml"); 5 Human human = null; 6 human = (Human)ctx.getBean("Chinese");//依賴註入獲取"chinese" 7 human.speak(); 8 } 9 }
運行結果:
中國人說:中文
中國人也說:英語
以上所使用的方法為設置註入,在xml文件中設置好了屬性值。(主要使用方法)
利用構造函數來設置依賴註入的方式為,構造註入,,這種方法在構造實例時,就已經為其完成屬性的初始化。
如次只需要對前面的Chinesse進行修改,不再需要屬性的setter()方法。而改為初始化屬性的構造函數
1 public Chinese(Language lan1, Language lan2) { 2 super(); 3 this.lan1 = lan1; 4 this.lan2 = lan2; 5 }
配置文件也做簡單修改:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 7 8 9 <bean id="Chinese" class="com.human.Chinese"> 10 <!-- property 元素用來指定需要容器註入的屬性,lan屬性需要容器註入 --> 11 <constructor-arg ref="chinese"></constructor-arg> 12 <constructor-arg ref="english"></constructor-arg> 13 </bean> 14 15 16 <!-- 註入English對象 --> 17 <bean id="english" class="com.language.English"></bean> 18 <!-- 註入chinese對象 --> 19 <bean id="chinese" class="com.language.Chinese"></bean> 20 </beans>
spring 依賴註入詳解