IoC,直覺地講,就是容器控制程式之間的關系,而非傳統實作中,由程式代碼直接操控。這也就是所謂“控制反轉”的概念所在。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。IoC還有另外一個名字——“依賴注入(Dependency
Injection)”。從名字上了解,所謂依賴注入,即元件之間的依賴關系由容器在運作期決定,形象地說,即由容器動态地将某種依賴關系注入到元件之中。
下面通過一個生動形象的例子介紹控制反轉。
比如,一個女孩希望找到合适的男朋友,如圖6-2所示,可以有3種方式,即青梅竹馬、親友介紹、父母包辦。
第1種方式是青梅竹馬,如圖6-3所示。
通過代碼表示如下。
public class Girl
{
void
kiss(){
Boy boy = new
Boy();
}
第2種方式是親友介紹,如圖6-4所示。
Boy boy =
BoyFactory.createBoy();
第3種方式是父母包辦,如圖6-5所示。
void kiss(Boy
boy){
// kiss
boy
boy.kiss();
哪一種為控制反轉IoC呢?雖然在現實生活中我們都希望青梅竹馬,但在Spring世界裡,選擇的卻是父母包辦,它就是控制反轉,而這裡具有控制力的父母,就是Spring所謂的容器概念。
典型的IoC可以如圖6-6所示。
IoC的3種依賴注入類型如下。
第1種是通過接口注射,這種方式要求我們的類必須實作容器給定的一個接口,然後容器會利用這個接口給我們這個類注射它所依賴的類。
public
class Girl implements Servicable {
Kissable
kissable;
public void service(ServiceManager
mgr) {
kissable = (Kissable)
mgr.lookup("kissable");
public void kissYourKissable()
kissable.kiss();
<container>
<component name="kissable"
class="Boy">
<configuration> … </configuration>
</component>
<component name="girl"
class="Girl"
/>
</container>
第2種是通過setter方法注射,這種方式也是Spring推薦的方式。
class Girl {
private Kissable
public void setKissable(Kissable
kissable) {
this.kissable =
}
public void kissYourKissable() {
<beans>
<bean id="boy" class="Boy"/>
<bean
id="girl" class="Girl">
<property
name="kissable">
<ref bean="boy"/>
</property>
</bean>
</beans>
第3種是通過構造方法注射類,這種方式Spring同樣給予了實作,它和通過setter方式一樣,都在類裡無任何侵入性,但是,不是沒有侵入性,隻是把侵入性轉移了,顯然第1種方式要求實作特定的接口,侵入性非常強,不友善以後移植。
public Girl(Kissable kissable)
PicoContainer
container = new
DefaultPicoContainer();
container.registerComponentImplementation(Boy.class);
container.registerComponentImplementation(Girl.class);
Girl
girl = (Girl)
container.getComponentInstance(Girl.class);
girl.kissYourKissable();
文章轉自: