Spring 的核心機制:依賴注入(控制反轉)

1、說到依賴注入(控制反轉),先要理解什麼是依賴。

Spring 把相互協做的關係稱爲依賴關係。假如 A 組件調用了 B 組件的方法,咱們可稱A 組件依賴於 B 組件java


2、什麼是依賴注入。

在傳統的程序設計過程當中,一般由調用者來建立被調用者的實例
spring

在依賴注入的模式下,建立被調用者的工做再也不由調用者來完成,所以稱爲控制反轉;建立被調用者實例的工做一般由Spring 容器來完成,而後注入給調用者,所以也稱爲依賴注入app


3、依賴注入的好處。

依賴注入讓 Spring 的 Bean 以被指文件組織在一塊兒,而不是以硬編碼的方式耦合在一塊兒程序完成無須理會被調用者的實現,也不無須主動定位工廠,這是最好的解耦方式實例之間的依賴關係由 IoC 容器負責管理

ide

4、依賴注入的 Spring 實現

一、設值注入

設值注入是指 IoC 容器使用屬性的 setting 方法來注入被依賴的實例。


先建立一個實體對象(Bean)
性能

[java] view plaincopy測試

  1. public class HelloWorld {    this

  2.     private String msg;    編碼

  3.     

  4.     public String getMsg() {     spa

  5.         return msg;    .net

  6.     }    

  7.     public void setMsg(String msg) {    

  8.         this.msg = msg;    

  9.     }    

  10. }   


再配置文件applicationContext.xml,實例化bean 

[java] view plaincopy

  1. <bean id="helloBean" class="com.spring.demo.HelloWorld">    

  2.        <property name="msg" value="Hello World!"/>    

  3.  </bean>   

最後測試是否可以獲得注入的bean,並打印出對象的屬性。 

[java] view plaincopy

  1. public static void main(String[] args){    

  2.         //讀取配置文件,得到BeanFactory    

  3.         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");    

  4.         BeanFactory factory = context;    

  5.             

  6.         HelloWorld hello = (HelloWorld)factory.getBean("hello");    

  7.             

  8.         System.out.println(hello.getMsg());     

  9.  }   


二、構造注入

除了設值注入,還有另外一種注入方式,這種方式在構造實例時,已爲其完成了依賴關係的初始化。這種利用構造器來設置依賴關係的方式,被稱爲構造注入。

先建立一個實體對象(Bean)

[java] view plaincopy

  1. public class HelloWorld {    

  2.     private String msg;    

  3.     

  4.     //須要一個默認無參構造器    

  5.     public HelloWorld(){}    

  6.         

  7.     public HelloWorld(String msg){    

  8.         this.msg = msg;    

  9.     }    

  10.         

  11.     public String getMsg() {    

  12.         return msg;    

  13.     }    

  14.     public void setMsg(String msg) {    

  15.         this.msg = msg;    

  16.     }    

  17. }   



再配置文件applicationContext.xml,實例化bean。

[java] view plaincopy

  1. <bean id="hello" class="com.spring.demo.HelloWorld">      

  2.      <constructor-arg index="0">     

  3.            <value>HelloWorld!</value>     

  4.        </constructor-arg>      

  5.  </bean>   



最後測試是否可以獲得注入的bean,並打印出對象的屬性。

[java] view plaincopy

  1. public static void main(String[] args){    

  2.         //讀取配置文件,得到BeanFactory    

  3.         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");    

  4.         BeanFactory factory = context;    

  5.             

  6.         HelloWorld hello = (HelloWorld)factory.getBean("hello");    

  7.             

  8.         System.out.println(hello.getMsg());     

  9.  }   


5、處理bean依賴關係的步驟

一、根據定義bean的配置建立並初始化BeanFactory實例 
二、每一個bean的依賴將以屬性、構造器參數、或靜態工廠方法參數的形式出現。當這些bean被實際建立時,這些依賴也將會提供給該bean。 
三、每一個屬性或構造器參數既能夠是一個實際的值,也能夠是對該容器中另外一個bean的引用。 
四、每一個指定的屬性或構造器參數值必須可以被轉換成特定的格式或構造參數所需的類型。 

Spring 會在容器被建立時驗證容器中每一個bean的配置,包括驗證那些bean所引用的屬性是否指向一個有效的bean。在bean被實際建立以前,bean的屬 性並不會被設置。伴隨着bean被實際建立,做爲該bean的依賴bean以及依賴bean的依賴bean也將被建立和分配。



6、兩種注入方式的對比

一、相比之下,設值注入具備以下的優勢:

(1)、與傳統的 JavaBean 的寫法更類似,程序開發人員更容易理解、接受。經過 Setting 方法設定依賴關係顯得更加直觀、天然。
(2)、對於複雜的依賴關係,若是採用構造注入,會致使構造過於臃腫,難以閱讀。Spring 在建立 Bean 實例時,須要同時實例化其依賴的所有實例,於是致使性能降低。而使用設值注入,則能避免這些問題。
(3)、尤爲是在某些屬性可選的狀況下,多參數的構造器更加笨重。

二、構造注入也不是絕對不如設值注入,在某些特定的場景下,構造注入比設值注入更優秀。構造注入也有以下優點:

(1)、構造注入能夠在構造器中決定依賴關係的注入順序,有限依賴的優先注入。例如,組件中某些其餘依賴關係的注入,嚐嚐須要依賴於 Datasource 的注入。採用構造注入,能夠在代碼中清晰地決定注入順序。
(2)、對於依賴關係無須變化的 Bean ,構造注入更有用處。由於沒有 setting 方法,全部的依賴關係所有在構造器內設定。所以,無須擔憂後續代碼對依賴關係產生的破壞。
(3)、依賴關係只能在構造器中設定,則只有組件的建立者才能改變組件的依賴關係。對組件的調用者而言,組件內部的依賴關係完成透明,更符合高內聚的原則。

兩種方式總結:建議採用以設值注入爲住,構造注入爲輔的注入策略。對於依賴關係無須變換的注入,儘可能採用構造注入;而其餘的依賴關係的注入,則考慮採用設值注入

相關文章
相關標籤/搜索