去掌握一門技術的時候,往往很多人都忽略了一點,只是一味地去寫代碼,原理層面的東西從來就不理會
還有就是學習的過程中,不去想為什么有了當前的寫法,卻有着這么一門技術可以代替它
一般來說,在寫程序的時候,一個類的實例創建都是直接通過 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方法注入一個實例
夢逸、原創,轉載請注明原文地址