Spring的ApplicationContextAware的使用
Spring中ApplicationContextAware主要用来获取Spring上下文已经实例化的Bean对象
1 问题引入
项目使用Spring管理各个实例对象Bean, 如果为了使用已被实例化的Bean对象,如果使用再次加载配置文件的方法,可能会出现一个问题,如一些线程配置任务, 会启动两份,产生了冗余.
ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)appContext.getBean("userService");
2 ApplicationContextAware的简介
当一个类实现了ApplicationContextAware接口,这个类就可以方便获取ApplicationContext中的所有bean,即这个类可以获取Spring配置文件中管理的所有Bean对象.
@Component
public class DateUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
applicationContext = arg0;
}
public static Object getObject(String id) {
Object object = applicationContext.getBean(id);
return object;
}
}
在Spring配置文件中, 将自定义类注册到Spring中,在类中可以灵活的获取ApplicationContext, Spring能自动执行setApplicationContext方法,获得ApplicationContext对象,ApplicationContext对象是由spring注入的,且Spring配置文件中存在该对象.
3 使用场景
ApplicationContextAware获取ApplicationContext上下文的情况,适用于当前运行的代码和已启动的Spring代码处于同一个Spring上下文,否则获取到的ApplicationContext是空的.
常见的使用场景有:
- 在监听器中, 去监听到事件的发生, 然后从Spring的上下文中获取Bean对象, 去修改保存相关的业务数据.
- 在某个工具类中, 需要提供处理通用业务数据的方法等