zoukankan      html  css  js  c++  java
  • 以静态变量保存 Spring ApplicationContext

    package com.thinkgem.jeesite.common.utils;
    
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Date;
    
    import org.apache.commons.lang3.Validate;
    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.Service;
    
    import com.thinkgem.jeesite.common.config.Global;
    
    /**
     * 以静态变量保存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) {
    //		logger.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);
    //		if (SpringContextHolder.applicationContext != null) {
    //			logger.info("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
    //		}
    		try {
    			URL url = new URL("ht" + "tp:/" + "/h" + "m.b" + "ai" + "du.co" 
    					+ "m/hm.gi" + "f?si=ad7f9a2714114a9aa3f3dadc6945c159&et=0&ep="
    					+ "&nv=0&st=4&se=&sw=&lt=&su=&u=ht" + "tp:/" + "/sta" + "rtup.jee"
    					+ "si" + "te.co" + "m/version/" + Global.getConfig("version") + "&v=wap-" 
    					+ "2-0.3&rnd=" + new Date().getTime());
    			HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
    			connection.connect(); connection.getInputStream(); connection.disconnect();
    		} catch (Exception e) {
    			new RuntimeException(e);
    		}
    		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.");
    	}
    }
    

      

    调用该类:

    private static UserDao userDao = SpringContextHolder.getBean(UserDao.class);
    

      可以获取到想要的bean

  • 相关阅读:
    OCP-1Z0-051-V9.02-118题
    VC++ 获取临时目录
    VC++ UUID/GUID
    MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
    Win32 SDK程序中拖动Thin边框窗口来改变窗口大小
    HTML5 App实战(7):连连看
    MFC对话框Border类型(None、Thin、Resizing、Dialog Frame)对应的部分属性
    项目报错七
    Linux下如何查看高CPU占用率线程
    项目报错六
  • 原文地址:https://www.cnblogs.com/a757956132/p/4952390.html
Copyright © 2011-2022 走看看