Created
March 22, 2019 08:08
-
-
Save larry1001/99b0f6475b6ff2ad36c2e127d0310b2e to your computer and use it in GitHub Desktop.
以静态变量保存Spring ApplicationContext
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.apache.commons.lang3.Validate; | |
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
import org.springframework.beans.factory.DisposableBean; | |
import org.springframework.context.ApplicationContext; | |
import org.springframework.context.ApplicationContextAware; | |
import org.springframework.context.annotation.Lazy; | |
import org.springframework.stereotype.Service; | |
/** | |
* 类名称:SpringContextHolder | |
* 类描述:以静态变量保存Spring ApplicationContext | |
*/ | |
@Service | |
@Lazy(false) | |
public class SpringContextHolder implements ApplicationContextAware, DisposableBean { | |
private static ApplicationContext applicationContext = null; | |
private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class); | |
/** | |
* 取得存储在静态变量中的ApplicationContext. | |
*/ | |
public static ApplicationContext getApplicationContext() { | |
assertContextInjected(); | |
return applicationContext; | |
} | |
/** | |
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. | |
*/ | |
@SuppressWarnings("unchecked") | |
public static <T> T getBean(String name) { | |
assertContextInjected(); | |
return (T) applicationContext.getBean(name); | |
} | |
/** | |
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. | |
*/ | |
public static <T> T getBean(Class<T> requiredType) { | |
assertContextInjected(); | |
return applicationContext.getBean(requiredType); | |
} | |
/** | |
* 清除SpringContextHolder中的ApplicationContext为Null. | |
*/ | |
public static void clearHolder() { | |
applicationContext = null; | |
} | |
/** | |
* 实现ApplicationContextAware接口, 注入Context到静态变量中. | |
*/ | |
@Override | |
public void setApplicationContext(ApplicationContext applicationContext) { | |
SpringContextHolder.applicationContext = applicationContext; | |
} | |
/** | |
* 实现DisposableBean接口, 在Context关闭时清理静态变量. | |
*/ | |
@Override | |
public void destroy() throws Exception { | |
SpringContextHolder.clearHolder(); | |
} | |
/** | |
* 检查ApplicationContext不为空. | |
*/ | |
private static void assertContextInjected() { | |
Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder."); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment