| package com.xcong.excoin.common.utils;  | 
| 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;  | 
|   | 
| import lombok.extern.slf4j.Slf4j;  | 
| @Component  | 
| @Slf4j  | 
| 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;  | 
|     }  | 
| }  |