Spring IoC原理詳解


 

  去掌握一門技術的時候,往往很多人都忽略了一點,只是一味地去寫代碼,原理層面的東西從來就不理會

還有就是學習的過程中,不去想為什么有了當前的寫法,卻有着這么一門技術可以代替它

 

  一般來說,在寫程序的時候,一個類的實例創建都是直接通過 new className(); 語法來操作。說真的,

我寫程序代碼都不這么去做,我只需要在程序里定義一個接口類型的屬性,直接通過屬性來調用接口的方法

java代碼:

 1 public class Girl_1 implements Girl {
 2     
   //定義一個接口類型的屬性
    private Dog dog; 3
    //定義該屬性的set方法,讓Spring來調用 4 public void setDog(Dog dog) { 5 this.dog = dog; 6 } 7 8 @Override 9 public void playDog() { 10 // TODO Auto-generated method stub 11 //調用方法,實際上是調用接口的方法
      dog.bark();
12 }
  }

 

 

  接口的實例來自於哪個Class類,在寫代碼的時候根本不用去理會,只需要在SpringXml配置文件中配置一下就可以了

Spring會自動的找到ClassBean_property所引用的類實例,調用Class類中屬性的set方法注入一個Class類實例

xml代碼:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans>
 3     <!-- 一個bean就是一個類的實例 -->
 4     <bean id="girl" class="springAop.Girl_1" scope="prototype">
 5     
 6         <property name="dog" ref="labrador" />
 7         <!-- 圖_3所示的接口類型的dog屬性 -->
 8         
 9     </bean>
10     
11     <!-- 通過property標簽的ref屬性,引用一個類的實例labrador -->
12     <bean id="labrador" class="springAop.Labrador" scope="prototype" />    
13     
14     <bean id="shepherdDog" class="springInject.ShepherdDog" scope="prototype" />
15 
16 </beans>    

 

   這里就涉及到IoC了,Inversion Of Control (控制反轉),這讓很多人不解,被控制的是誰,反轉指的又是什么,舉一反三,有反轉就有正轉

  夢逸來告訴大家

  其實IoC真正意義上是[資源提供者],互聯網上所說的控制反轉中的控制也並不是一個動作,只是一個名詞,所以大家不要弄混了

 

  Spring的xml配置文件就相當於是一個容器,它托管着整個程序中的Class類實例,通過在xml文件中定義一個bean,(上文xml代碼所示)

  bean標簽指定一個Class類,然后在bean節點中的property標簽指定Class類定義的接口類型的屬性,通過property標簽的ref屬性指定一個bean標

  簽的id,注入一個實例給Class類中的屬性。

  (PS1:一個bean就是一個類的實例;一個property就是Class類中定義的接口類型屬性)

  (PS2:property的ref屬性指定ClassBean的id,注入一個Class類實例給Class類中定義的接口類型屬性)

 

   下面夢逸附上一張圖幫助大家理解反轉是怎么一回事

 

  上圖就是反轉的大致解釋了,寫程序的時候,一般的代碼都是直接的定義一個屬性,然后直接創建一個實例並賦值:Girl girl = new Girl_2();

 

  IoC設計模式很人性化的實現了這一點,反過來了,使用Ioc設計模式,程序代碼中不再出現 new Girl_2();這種new關鍵字的創建實例代碼

 

  只需要在程序中定義一個屬性,屬性的值是null,也就是說不用賦值,然后添加該屬性的set方法,讓Spring調用該屬性的set方法注入一個實例

 

 

 

  夢逸、原創,轉載請注明原文地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM