| 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; | 
|     } | 
| } |