在我們的Web應用中,Spring容器通常采用聲明式方式配置産生。開發者隻要在web.xml中配置一個Listener,該Listener将會負責初始化Spring容器,MVC架構可以直接調用Spring容器中的Bean,無需通路Spring容器本身。在這種情況下,容器中的Bean處于容器管理下,無需主動通路容器,隻需接受容器的依賴注入即可。
但在某些特殊的情況下,Bean需要實作某個功能,但該功能必須借助于Spring容器才能實作,此時就必須讓該Bean先擷取Spring容器,然後借助于Spring容器實作該功能。為了讓Bean擷取它所在的Spring容器,可以讓該Bean實作ApplicationContextAware接口。也就是說當一個類實作了這個接口之後,這個類就可以友善獲得ApplicationContext中的所有bean。換句話說,就是這個類可以直接擷取spring配置檔案中,所有有引用到的bean對象。
工具類:
@Component
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
/*
* (non-Javadoc)
* @see
* org.springframework.context.ApplicationContextAware#setApplicationContext
* (org.springframework.context.ApplicationContext)
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
public static void clearHolder() {
applicationContext = null;
}
}
Spring容器會檢測容器中的所有Bean,如果發現某個Bean實作了ApplicationContextAware接口,Spring容器會在建立該Bean之後,自動調用該Bean的setApplicationContext()方法,調用該方法時,會将容器本身作為參數傳給該方法——該方法中的實作部分将Spring傳入的參數(容器本身)賦給該類對象的applicationContext執行個體變量,是以接下來可以通過該applicationContext執行個體變量來通路容器本身。