天天看點

spring IOC原理

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(); 

文章轉自: