一、IoC概念
IoC(Inversion of Control):中文譯為控制反轉。
IOC的基本概念是:不建立對象,但是描述建立它們的方式。在代碼中不直接與對象和服務串連,但在設定檔中描述哪一個組件需要哪一項服務。容器負責將這些聯絡在一起。
其原理是基於OO設計原則的The Hollywood Principle:Don't call us, we'll call you(別找我,我會來找你的)。也就是說,所有的組件都是被動的(Passive),所有的組件初始化和調用都由容器負責。組件處在一個容器當中,由容器負責管理。
簡單的來講,就是由容器控製程序之間的關係,而非傳統實現中,由程式碼直接操控。這也就是所謂“控制反轉”的概念所在:控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。
二、Spring IoC
Spring IoC容器實現了IoC設計模式,對外提供兩個介面實現對Spring IoC容器的訪問:
1. BeanFactory:位於org.springframework.beans.factory包中。藉助於設定檔實現對JavaBean的配置和管理。主要應用於開發Java應用。
2. ApplicationContext:位於org.springframework.context包中。繼承於BeanFactory,增加了IoC整合、處理訊息資源、事件等功能。主要用於開發J2EE應用,是Spring推薦使用的介面。
要獲得appcontext.xml中定義的JavaBean,應用代碼只需要調用BeanFactory的getBean方法即可。
Bean的生命週期
IoC容器定義了Spring設定檔中JavaBean應遵循的規則,即Bean定義(BeanDefinition)。任何處於IoC容器控制下的JavaBean的生命週期都存在4個階段:
1.執行個體化JavaBean。
2.JavaBean執行個體的初始化,即通過IoC注入其依賴性。這一階段將完成JavaBean執行個體的初始化。
3.基於Spring應用對JavaBean執行個體的使用。
4.Ioc容器銷毀JavaBean執行個體。
Bean的建立
聲明方式:<bean name="fileHelloWorld" class="testspring.sample.HelloWorld"/>
可用參數:
factory-method:聲明建立JavaBean的Factory 方法。
factory-bean:聲明工廠類。
<ref>:引用其它資源(bean執行個體)。
初始化JavaBean
1.可以使用autowire屬性,使Spring自動將目標JavaBean需要注入的JavaBean找到並注入進來。
2.使用dependency-check屬性,保證各個Spring設定檔中各個JavaBean之間的相互關係。
3.藉助setter方法,將JavaBean的屬性值注入進來。這些屬性值可以使Java原型、物件類型、其它JavaBean、null等。
4.如果JavaBean實現了org.springframework.beans.factory.BeanFactoryAware介面,則還需要調用setBeanFactory方法。
5.Spring架構提供了若干介面,供開發人員改變更配置置在BeanFactory中JavaBean的行為時使用。比如InitializingBean介面。BeanFactory初始化JavaBean時,會調用實現了InitializingBean介面的JavaBean中的aferPropertiesSet()方法。
6.通過在<bean>元素中包含init-method屬效能夠達到同InitializingBean一樣的目的。即初始化時會自動調用init-method中定義的方法。
注意:如果5和6兩者同時使用,Spring首先執行5中的aferPropertiesSet()方法,然後執行init-method中定義的方法。
使用JavaBean
一旦Spring建立並初始化JavaBean執行個體後,應用就可以使用JavaBean執行個體了。
銷毀JavaBean
一旦將基於Spring的(Web)應用停止,Spring架構將調用那些JavaBean執行個體中存在的生命週期方法,比如實現了DisposableBean介面的JavaBean,或者在Spring設定檔中指定了destroy-method蘇醒的JavaBean。
注意:
1.上述內容只適合於通過“singleton”方式建立的JavaBean執行個體。對於以“prototype”方式建立的JavaBean執行個體,Spring並不能夠控制其生命週期。
2.JavaBean建立時間。對於BeanFactory而言,在使用者調用getBean()方法時建立JavaBean執行個體。而對於ApplicationContext而言,一旦ContextLoaderServlet或ContextLoaderListener初始化成功,所有JavaBean執行個體都將會被建立。