项目用到了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()方法。