1. 程式人生 > >spring 依賴註入詳解

spring 依賴註入詳解

3.1 代碼 peak mxml 手動 初始化 org contex thum

當我們對一個javaBean進行實例化時,在原本的情況下我們會選擇新建一個接口,然後進行實例化,為了進一步降低耦合度我們還會使用工廠模式進行封裝。

例:

當我們想要去造,Chinese、American 時,我們會先去建造接口Human 在用Chinese American 來實現Human接口,同時建立HumanFactoy 在需要對象時 我們可以通過調用HumanFactory 來完成。

簡單點來說我們可以這樣去實現:

1 public    Human getHuman(String human){
2     if (human.equals("Chinese")) {
3         return
new 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 依賴註入詳解