SpringContextHolder类

橙三吉。 提交于 2020-01-20 23:46:21

1、通常使用SpringContextHolder类获取bean实例:

      解决: 如果要在静态方法中调用某一bean的方法,那么该bean必须声明为static的,但正常情况下@Autowired无法注入静态的bean,。

                  利用Spring的使用SpringContextHolder工具类的getBean方法来获取静态bean。

 

/** * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext. *  */@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() {      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();   }   /**    * 检查ApplicationContext不为空.    */   private static void assertContextInjected() {      Validate.validState(applicationContext != null,            "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");   }}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!