獲取Spring的上下文環(huán)境ApplicationContext的最簡單方式
獲取Spring上下文環(huán)境ApplicationContext
Web項目中發(fā)現(xiàn)有人如此獲得Spring的上下環(huán)境:
public class SpringUtil {
public static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
public static Object getBean(String serviceName){
return context.getBean(serviceName);
}
}
在web項目中這種方式非常不可?。。。?/p>
分析:
首先,主要意圖就是獲得Spring上下文;
其次,有了Spring上下文,希望通過getBean()方法獲得Spring管理的Bean的對象;
最后,為了方便調用,把上下文定義為static變量或者getBean方法定義為static方法;
但是,在web項目中,系統(tǒng)一旦啟動,web服務器會初始化Spring的上下文的,我們可以很優(yōu)雅的獲得Spring的ApplicationContext對象。
如果使用
new ClassPathXmlApplicationContext("applicationContext.xml");
相當于重新初始化一遍!?。?!
也就是說,重復做啟動時候的初始化工作,第一次執(zhí)行該類的時候會非常耗時?。。。。?/p>
正確的做法是:
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext; // Spring應用上下文環(huán)境
/*
* 實現(xiàn)了ApplicationContextAware 接口,必須實現(xiàn)該方法;
*通過傳遞applicationContext參數(shù)初始化成員變量applicationContext
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) applicationContext.getBean(name);
}
}
注意:
這個地方使用了Spring的注解@Component,如果不是使用annotation的方式,而是使用xml的方式管理Bean,記得寫入配置文件
<bean id="springContextUtil" class="com.ecdatainfo.util.SpringContextUtil" singleton="true" />
其實
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
這種方式獲取Sping上下文環(huán)境,最主要是在測試環(huán)境中使用,比如寫一個測試類,系統(tǒng)不啟動的情況下手動初始化Spring上下文再獲取對象!
Spring上下文(ApplicationContext)理解
什么是Spring應用上下文呢???
什么是應用上下文呢,應用上下文即是Spring容器的一種抽象化表述;而我們常見的ApplicationContext本質上說就是一個維護Bean定義以及對象之間協(xié)作關系的高級接口。
Spring的核心是容器,而容器并不唯一,框架本身就提供了很多個容器的實現(xiàn),大概分為兩種類型:一種是不常用的BeanFactory,這是最簡單的容器,只能提供基本的DI功能;還有一種就是繼承了BeanFactory后派生而來的應用上下文,其抽象接口也就是上面提到的的ApplicationContext,它能提供更多企業(yè)級的服務,例如解析配置文本信息等等,這也是應用上下文實例對象最常見的應用場景。
有了上下文對象,我們就能向容器注冊需要Spring管理的對象了。對于上下文抽象接口,Spring也為我們提供了多種類型的容器實現(xiàn),供我們在不同的應用場景選擇——
- ① AnnotationConfigApplicationContext:從一個或多個基于java的配置類中加載上下文定義,適用于java注解的方式;
- ② ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置文件中加載上下文定義,適用于xml配置的方式;
- ③ FileSystemXmlApplicationContext:從文件系統(tǒng)下的一個或多個xml配置文件中加載上下文定義,也就是說系統(tǒng)盤符中加載xml配置文件;
- ④ AnnotationConfigWebApplicationContext:專門為web應用準備的,適用于注解方式;
- ⑤ XmlWebApplicationContext:從web應用下的一個或多個xml配置文件加載上下文定義,適用于xml配置方式。
備注:
通過.class文件獲取bean的方法:
public abstract class AbstractCreateRoomHandler implements ApplicationContextAware {
//存放商家和處理器的映射關系
private static final Map<Integer, Class<? extends AbstractCreateRoomHandler>> TYPE_HANDLER = new HashMap<>();
private static ApplicationContext applicationContext;
static {
TYPE_HANDLER.put(BusinessCodeEnum.TUSE.getBusinessCode(), TuSeCreateRoomHandler.class);
//todo 新的商家類型添加到此處
}
public static AbstractCreateRoomHandler getCreateRoomHandler(Integer productType) {
Class<? extends AbstractCreateRoomHandler> clazz = TYPE_HANDLER.getOrDefault(productType, TuSeCreateRoomHandler.class);
return applicationContext.getBean(clazz);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
why在重寫equals時還必須重寫hashcode方法分享
首先我們先來看下String類的源碼:可以發(fā)現(xiàn)String是重寫了Object類的equals方法的,并且也重寫了hashcode方法2013-10-10
Java8優(yōu)雅的字符串拼接工具類StringJoiner實例代碼
這篇文章主要給大家介紹了關于Java8優(yōu)雅的字符串拼接工具類StringJoiner的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02

