原文連結: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取相對路徑,友善項目的移植。