天天看點

Spring動态擷取IoC容器中管理的Bean

原文連結:http://pbcljf.blog.163.com/blog/static/340340192010513537424/

Spring架構将DI模式發揮到了極至,是以,系統裡面用Spring管理的Bean互相之間的擷取是非常友善的,隻要使用者提供一個setter方法并在配置檔案中配置該屬性就可以。

但是,對于系統中非Spring架構管理的類,如果需要擷取Spring管理的類,或者,程式中需要動态的根據Be

an的id來擷取Bean執行個體,不可能事先為該類提供所有需要的Bean屬性的setter方法,在類似這樣的情況下,

擷取Spring架構管理的類執行個體的方法有多種,現在簡單總結如下:

方法一:在初始化時儲存ApplicationContext對象

代碼:

ApplicationContext ac = new FileSystemXmlApplicationContext(”applicationContext.xml”);

ac.getBean(”beanId”);

說明:

這種方式适用于采用Spring架構的獨立應用程式,需要程式通過配置檔案手工初始化Spring的情況。

方法二:通過Spring提供的工具類擷取ApplicationContext對象

代碼:

import org.springframework.web.context.support.WebApplicationContextUtils;

ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)

ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContextsc)

ac1.getBean(”beanId”);

ac2.getBean(”beanId”);

說明:

這種方式适合于采用Spring架構的B/S系統,通過ServletContext對象擷取ApplicationContext對象,然後

在通過它擷取需要的類執行個體。

上面兩個工具方式的差別是,前者在擷取失敗時抛出異常,後者傳回null。

方法三:繼承自抽象類ApplicationObjectSupport

說明:

抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以友善的擷取到ApplicationCont

ext。Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext

context)方法将ApplicationContext 對象注入。

方法四:繼承自抽象類WebApplicationObjectSupport

說明:

類似上面方法,調用getWebApplicationContext()擷取WebApplicationContext

方法五:實作接口ApplicationContextAware

說明:

實作該接口的setApplicationContext(ApplicationContext context)方法,并儲存ApplicationContext 對

象。Spring初始化時,會通過該方法将ApplicationContext 對象注入。

以上方法适合不同的情況,請根據具體情況選用相應的方法。

這裡值得提一點的是,系統中用到上述方法的類實際上就于Spring架構緊密耦合在一起了,因為這些類是知

道它們是運作在Spring架構上的,是以,系統中,應該盡量的減少這類應用,使系統盡可能的獨立于目前運

行環境,盡量通過DI的方式擷取需要的服務提供者。

本人認為,方法五比較可行,可以設計一個工具類,專門來擷取Spring中的類。減少對業務代碼的侵入性。

小龍推薦:動态擷取IoC容器管理的Bean依賴于項目的運作環境,是以可以通過配置參數的方式選擇實作方式

如果是C/S架構的項目,可以通過FileSystemXmlApplicationContext程式接口構造ApplicationContext對象;

如果是B/S架構的項目,可以通過Spring提供的工具類擷取ApplicationContext對象,即第二種方法。

無論怎麼實作,都需要注意加載的Spring配置檔案的路徑,推薦使用classpath取相對路徑,友善項目的移植。

繼續閱讀