项目用到了ApplicationContextAware,通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContext方法。
我们在ApplicationContextAware的实现类中,就可以通过这个上下文环境对象得到Spring容器中的Bean。
使用方法如下:
1.实现ApplicationContextAware接口:
import org.apache.commons.lang.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; 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, 自动转型为所赋值对象的类型. 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() { logger.debug("clean SpringContextHolder ApplicationContext:" + applicationContext); applicationContext = null; } //实现ApplicationContextAware接口, 注入Context到静态变量中. @Override public void setApplicationContext(ApplicationContext applicationContext) { logger.debug("inject ApplicationContext to SpringContextHolder:{}", applicationContext); if (SpringContextHolder.applicationContext != null) { logger.warn("SpringContextHolder ApplicationContext covered, original ApplicationContext :" + SpringContextHolder.applicationContext); } SpringContextHolder.applicationContext = applicationContext; } //实现DisposableBean接口, 在Context关闭时清理静态变量. @Override public void destroy() throws Exception { SpringContextHolder.clearHolder(); } //检查ApplicationContext不为空. private static void assertContextInjected() { Validate.notNull(applicationContext != null, "applicaitonContext attribute not injected , applicationContext.xml assign SpringContextHolder."); } }
2.在Spring的配置文件中配置这个类,Spring容器会在加载完Spring容器后把上下文对象调用这个对象中的setApplicationContext方法:
<bean id="springContextHolder" class="com.qing.utils.SpringContextHolder" />
在项目中即可通过这个SpringContextHolder调用getBean()方法得到Spring容器中的对象了。
3. 这里同时也实现了DisposableBean 接口,主要是为了实现destroy()方法。