ApplicationContextAware接口的作用
当一个类实现了这个接口之后,这个类就可以方便的获得ApplicationContext对象(spring上下文),Spring发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContext(参数)方法,调用该方法时,会将容器本身ApplicationContext对象作为参数传递给该方法
@Slf4j
@Service
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware , DisposableBean {
private static ApplicationContext applicationContext = null;
public ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 实现DisposableBean接口, 在Context关闭时清理静态变量.
*/
@Override
public void destroy() {
SpringContextHolder.clearHolder();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.applicationContext = applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {return (T) applicationContext.getBean(name);}
public static <T> T getBean(Class<T> className) {return (T) applicationContext.getBean(className);}
/**
* 清除SpringContextHolder中的ApplicationContext
*/
public static void clearHolder() {
if (log.isDebugEnabled()) {
log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
}
applicationContext = null;
}
/**
* 事件发布
* @param event 事件
*/
public static void publishEvent(ApplicationEvent event) {
if (applicationContext == null) {
return;
}
applicationContext.publishEvent(event);
}
}
实现了ApplicationContextAware 接口之后就必须实现其setApplicationContext,主要就是让我们的实现类获取到ApplicationContext对象,然后我们就可以通过ApplicationContext获取spring容器中加载好的Bean了。