Spring框架的核心就是控制反轉(IOC)和依賴注入(Dependency Injection),經過這兩個方面來實現耦合。html
使用Ioc,對象是被動的接受依賴類,而不是主動的去找。容器在實例化的時候主動將它的依賴類注入給它。通俗理解:控制反轉就是將類的主動權轉移到接口上,依賴注入經過xml配置文件在類實例化時將其依賴注入。java
經過一個實際的例子來理解:
spring
假設需求爲:類Business須要調用類Dependency的方法f()。框架
咱們常規作法以下:測試
//1.建立類Dependency public class Dependency { //建立類的方法 public void f() {}; } //2.建立類Business public class Business { //屬性 Dependency d; //方法 //方法功能:new一個實例對象 public Business() { d = new Dependency(); } public void doSth() { d.f(); } } //3.建立對象,調用方法 b = new Business(); b.doSth;
在此,針對如上方法作出一些修改this
1.將Business裏面的Dependency實例的得到改成setter方式spa
2.將Dependency類改成某個接口的實現code
//1.建立類Dependency public class Dependency { public void f() {}; } //2.建立接口Idependency public interface Idependency { //這個方法的參數能夠是一個對象 void f(); } //3.建立類Business public class Business { Idependency d; public void setDependency(Idependency d) { this.d =d; } public void doSth() { d.f(); } }
在如上代碼中,orm
1.Business的實例變量d能夠接收任何Idependency類型的實例對象xml
2.Dependency的實例對象不是經過Business來得到,而是經過接口中方法的參數傳進來
3.Dependency的實例對象如何從外部注入給Business呢?這就要經過xml文件來實現。
4.建立一個SpringXX.xml文件,進行簡單配置:
<beans> <bean id = "dependency" class = "xx.xx.Dependency" /> <bean id = "business" calss = "xx.xx.Business" > <property name = "dependency"> <ref bean = "dependency" /> </property> </bean> </beans>
如上的配置文件裏將Dependency類和Business類加入,並將Dependency的實例對象做爲Business實例對象的方法的一參數。
5.寫一個測試類來加載xml文件,spring提供了現成的API,在加載上面的xml文件的時候,完成了以下工做:1>實例化Dependency類和Business類,並將Dependency的實例對象做爲參數賦值給了Business的實例對象的setDependency()方法。測試程序以下:
public class CeShi { public static void main(String [] args) { //1.加載xml文件 XXclass xx = new XXclass("SpringXX.xml"); BeanFactory factory = new XmlBeanFactory(xx); //2.實例對象 Business b = (Business)factory.getBean("business"); //3.用實例的對象調用方法 b.doSth(); } }
上面的程序加載了xml文件後,得到id爲"business"的bean,即Business類的實例,並調用了他的方法doSth()。因而可知,Business的依賴包Dependency是經過xml來注入的,而且Business是經過接口Idependency來接收Dependency實例。所以,有新的Idependency的實現時,只須要修改xml文件便可,測試程序只須要根據xml裏面的id值來得到須要的參數便可。
總結,經過上面的例子,對控制反轉和依賴注入已經能理解了,依賴類(Dependency)是經過外部(xml)來注入的,而不是使用它的類(Business)來本身建立,這就是依賴注入。另外一方面,Business對類Dependency的依賴轉移到對接口Idependency的依賴,控制權由類轉到了接口,即由「實現」轉移到「抽象」中,這就是控制反轉。
控制反轉(Ioc)的理解
很簡單,原本該咱們本身作的事情,咱們不作,讓系統去作。例如,當咱們須要調用某個對象的實例方法時,咱們每每須要先new出這個實例對象,再用實例對象去調用方法;若是使用了控制反轉,則咱們不須要作如上事情了,只須要在配置文件xml裏面配置好就行,系統幫咱們new實例對象。
依賴注入的理解
spring主動建立被調用類的對象,而後把這個對象注入到咱們本身的類中,使得咱們可使用它。
//參考例子
http://www.cnblogs.com/xing901022/p/3963962.html