使用静态变量缓存ApplicationContext
第一种方法:
1:?声明如下类:
?
package com.rayoo.tech.core.utils.spring;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.DisposableBean;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/** * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. * */public class SpringContextHolder implements ApplicationContextAware, DisposableBean {private static ApplicationContext applicationContext = null;private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);/** * 实现ApplicationContextAware接口, 注入Context到静态变量中. */public void setApplicationContext(ApplicationContext applicationContext) {logger.debug("注入ApplicationContext到SpringContextHolder:" + applicationContext);if (SpringContextHolder.applicationContext != null) {logger.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);}SpringContextHolder.applicationContext = applicationContext; //NOSONAR}/** * 实现DisposableBean接口,在Context关闭时清理静态变量. */@Overridepublic void destroy() throws Exception {SpringContextHolder.clear();}/** * 取得存储在静态变量中的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 clear() {logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);applicationContext = null;}/** * 检查ApplicationContext不为空. */private static void assertContextInjected() {if (applicationContext == null) {throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");}}}?
?2:
在applicationContext.xml中定义如下:
?
<!-- 使用 静态变量缓存applicationContext --><bean lazy-init="false"/>
?
?
第二种方法:
?
1:声明类如下:
?
package com.rayoo.tech.listener.cache;import javax.servlet.ServletContextEvent;import org.springframework.web.context.ContextLoaderListener;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;public class CacheListener extends ContextLoaderListener {private static WebApplicationContext context = null;@Overridepublic void contextInitialized(ServletContextEvent event) {CacheListener.context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());}}??2:?在web.xml中定义如下:
?
<listener><listener-class>com.rayoo.tech.listener.CacheListener</listener-class></listener>