package cc.mrbird.febs.common.utils;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.BeansException;
|
import org.springframework.beans.factory.DisposableBean;
|
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContextAware;
|
import org.springframework.stereotype.Component;
|
|
/**
|
* @Author wzy
|
* @Date 2020/5/11
|
* @email wangdoubleone@gmail.com
|
* @Version V1.0
|
**/
|
@Slf4j
|
@Component
|
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
|
|
private static ApplicationContext applicationContext = null;
|
|
/**
|
* 从静态变量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);
|
}
|
|
private static void assertContextInjected() {
|
if (applicationContext == null) {
|
throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" +
|
".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
|
}
|
}
|
|
/**
|
* 检查ApplicationContext不为空.
|
*/
|
private static void clearHolder() {
|
log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
|
applicationContext = null;
|
}
|
|
@Override
|
public void destroy() throws Exception {
|
SpringContextHolder.clearHolder();
|
}
|
|
@Override
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
if (SpringContextHolder.applicationContext != null) {
|
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
|
}
|
SpringContextHolder.applicationContext = applicationContext;
|
}
|
}
|