content: package com.platform.utils;
  
  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.Component;
  import org.springframework.stereotype.Service;
  
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  
  @Component
  @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() {
  		return applicationContext;
  	}
  
  	/**
  	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
  	 */
  	@SuppressWarnings("unchecked")
  	public static <T> T getBean(String name) {
  		return (T) applicationContext.getBean(name);
  	}
  
  	/**
  	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
  	 */
  	public static <T> T getBean(Class<T> requiredType) {
  		return applicationContext.getBean(requiredType);
  	}
  
  	/**
  	 * 清除SpringContextHolder中的ApplicationContext为Null.
  	 */
  	public static void clearHolder() {
  		if (logger.isDebugEnabled()) {
  			logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
  		}
  		applicationContext = null;
  	}
  
  	/**
  	 * 实现ApplicationContextAware接口, 注入Context到静态变量中.
  	 */
  	@Override
  	public void setApplicationContext(ApplicationContext applicationContext) {
  		SpringContextHolder.applicationContext = applicationContext;
  	}
  
  	/**
  	 * 实现DisposableBean接口, 在Context关闭时清理静态变量.
  	 */
  	@Override
  	public void destroy() throws Exception {
  		SpringContextHolder.clearHolder();
  	}
  
  	/**
  	 * 获取 @Service 的所有 bean 名称
  	 * @return /
  	 */
  	public static List<String> getAllServiceBeanName() {
  		return new ArrayList<>(Arrays.asList(applicationContext
  				.getBeanNamesForAnnotation(Service.class)));
  	}
  
  }
  