Spring框架的核心就是控制反轉(Inversion of Control)和依賴注入(Dependency Injection),通過這兩方面來實現鬆耦合。
使用IoC,對象是被動的接受依賴類,而不是自己主動的去找。容器在實例化的時候主動將它的依賴類注入給它。可以這樣理解:控制反轉將類的主動權轉移到接口上,依賴注入通過xml配置文件在類實例化時將其依賴類注入。通過下面的實例來逐步的理解:
首先假設有一個需求,類Business需要調用類Dependency的方法f(),按照日常的做法,得到下面的代碼:
//**類Dependency**
public class Dependency {
public void f() {};
}
//**類Business**
public class Business {
Dependency d;
public Business() {
d = new Dependency();
}
public void doSth() {
d.f();
}
}
對上述實現做出如下修改:
首先,將Business裏的Dependency實例的獲得該爲setter方式,其次,將Dependency類改爲某個接口的實現。故可以得到下面新的代碼:
//**接口IDependency**
public interface IDependency {
void f();
}
//**類Dependency**
public class Dependency {
public void f() {};
}
//**類Business**
public class Business {
IDependency d;
public Business() {}
public void doSth() {
d.f();
}
public void setDependency(IDependency d) {
this.d = d;
}
}
在新的代碼中,首先Business的變量d可以接收任何IDependency的實例,另外,Dependency的實例不是通過Business來獲
得,而是通過setter(也可以用構造器)來由外部傳給它。這似乎跟我們往常的代碼沒什麼不同,但這已經是一個良好的設計。關鍵就是
Dependency的實例如何從外部注入給Business呢?
這就要通過xml來實現了。
創建一個SpringFirst.xml,進行簡單的配置:
<beans>
<bean id = "dependency" class = "aopfirst.business.Dependency" />
<bean
id = "business"
class = "aopfirst.business.Business"
>
<property name = "dependency">
<ref bean = "dependency" />
</property>
</bean>
</beans>
這個配置文件裏將Dependency類和Business類加入,並將Dependency作爲Business的一個參數。
單有了這個xml文件還不夠,還需要一個測試類來加載該xml文件,spring提供了現成的API,在加載上面的xml的時候,就進行了如下工作:實例
化Dependency類,實例化Business類,並將Dependency的實例作爲參數賦給了Business實例的
setDependency()方法。下面是該測試程序:
public class StartServer {
public static void main(String [] args) {
ClassPathResource cr = new ClassPathResource("SpringFirst.xml");
BeanFactory factory = new XmlBeanFactory(cr);
Business b = (Business)factory.getBean("business");
b.doSth();
}
}
上面的程序加載了xml以後,獲得id爲"business"的bean,即Business類的實例,並調用了其doSth()
方法。由此可見,Business的依賴類Dependency是通過xml來注入的,而且Business是通過接口IDependency來接收
Dependency實例。因此,當我們又有新的IDependency的實現時,只需要修改xml文件即可,測試程序只需要根據xml裏的id值來獲得
需要的參數。
總結上面的例子,對控制反轉和依賴注入已經能理解了。依賴類(Dependency)是通過外部(xml)來注入的,而不是由使用它的類
(Business)來自己製造,這就是依賴的注入。另一方面,Business對類Dependency的依賴轉移到對接口IDependency的依
賴,控制權由類轉移到了接口,即由"實現"轉移到"抽象"中。這就是控制反轉。
Spring控制反轉(IoC)的理解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.