以静态变量保存 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

时间: 2024-11-05 20:45:06

以静态变量保存 Spring ApplicationContext的相关文章

android产品研发(十)--&gt;不使用静态变量保存数据

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android中的几种常见网络协议:xml,json,protobuf等,以及各自的优缺点,一般而言主要我们的App涉及到了网络传输都会有这方面的内容,具体可根据项目的需求确定各自的网络传输协议.这里可参考android产品研发(九)–>App网络传输协议 而本文讲解的其实并不是一个技术方面,而是一个android产品研发过程中的技巧:尽量不使用静态变量保存核心数据.这是为什么呢?这是因为android的进程并不是安全的,包括applicat

Spring它不支持依赖注入static静态变量

在springframework在,我们不能@Autowired静态变量,制作spring bean,例如,没有那么: @Autowired private static YourClass yourClass; 可以试一下,yourClass在这样的状态下不可以被依赖注入,会抛出执行时异常java.lang.NullPointerException,为什么呢?静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入. 而使用静态变量/类变量扩大了静态方法的使用

静态变量惹得祸

由于对静态变量的轻易使用,导致了系统的bug. 背景:页面后台定义了全局的静态变量保存前台展示的数据A 问题现象:当多个用户同时访问此页面时,会出现A的值跟当前数据不匹配的现象. 原因:静态变量保存在公共数据区,多个用户访问同一页面时,是从内存里的同一个地址取得的数据.所以为导致数据的混乱.

Android中静态变量的生命周期

静态变量的生命周期,起始于类的加载,终止于类的释放.什么时候类会加载呢?我们知道,在app打开时,会创建一个进程,然后初始化一个dvm的实例,负责类的加载释放 和 垃圾回收等.换句话说,在进程创建之后,就会加载类,静态变量诞生了.那何时释放?当然是在类卸载的时候.同上面.在进程结束之前,静态变量就寿终正寝.我们知道,Android中,你是不知道何时进程会被Kill.所以1.不能保证静态变量会一直存在.(进程可能被Kill掉)2.每次打开app时静态变量的值都是初始值(进程没有被kill掉所以静态

spring 对静态变量进行注解

要对静态变量进行注入 @Resource private static ITecharchService techarchService;//注入为空,spring注解注入不支持静态变量注入 查资料找到可以这样注入 @Component //必须是组件,才可以用@PostConstruct public class DDUtils{ @Resource private ITecharchService techarchService; private static DDUtils dd; @Po

Spring不支持依赖注入static静态变量

在springframework里,我们不能@Autowired一个静态变量,使之成为一个spring bean,例如下面这样: Java代码 @Autowired private static YourClass yourClass; 可以试一下,yourClass在这种状态下不能够被依赖注入,会抛出运行时异常java.lang.NullPointerException,为什么呢?静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入. 而使用静态变量/类变

spring 给静态变量注入值

一般在spring中,给static变量加上@Autowired注解的时候会报空指针异常错误. 解决: 1.通过xml配置文件配置 这个就不多说了. 2.通过注解 @Component public class StructUtil { private static AttendanceMapper attendanceMapper; @Autowired public void setAttendanceMapper(AttendanceMapper attendanceMapper) { S

Spring注入值到静态变量

Spring不允许将值注入静态变量,例如: import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class GlobalValue { @Value("${mongodb.db}") public static String DATABASE; } 如果打印GlobalValue.DATA

Spring注解无法注入静态变量

参考:https://blog.csdn.net/BuquTianya/article/details/49009831 1.使用xml方式声明Bean,在xml中注入静态变量: 2.使用一个非静态的变量注入,然后在@PostConstruct标记的方法中给静态变量赋值. 3,在静态方法中获取bean AppConfMapper appConfMapper = (AppConfMapper) BeanHoldFactory.getApplicationContext().getBean("app