在Web应用中,Spring容器通常采用声明式方式配置产生:开发者只要在web.xml中配置一个Listener,该Listener将会负责初始化Spring容器,MVC框架可以直接调用Spring容器中的Bean,无需访问Spring容器本身。在这种情况下,容器中的Bean处于容器管理下,无需主动访问容器,只需接受容器的依赖注入即可。
但在某些特殊的情况下,Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器实现该功能。为了让Bean获取它所在的Spring容器,可以让该Bean实现ApplicationContextAware接口。
在一些情况下在一些不是spring的容器中需要用到spring的bean对象又不能使用new一个的情况下使用ApplicationContextAware接口可以直接拿到当前spring容器,获取到当前容器中的ApplicationContext然后从中直接获取,也就是这个类就可以方便获得ApplicationContext中的所有bean,换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。
二、怎么使用这个接口?
例如我有一个方法类AppUtil,这个方法类中需要使用到的ApplicationContext中的某个bean(companyService)。
二、方法类AppUtil的处理
1、方法类AppUtil实现ApplicationContextAware接口:
1 | public class AppUtil implements ApplicationContextAware |
2、为方法类AppUtil增加一个静态的成员ApplicationContext类型的对象。以后方法类AppUtil获取ApplicationContext,就是通过读取这个成员变量的。具体如下所示:
1 | private ApplicationContext appContext; |
实现ApplicationContextAware接口的默认方法:
1 2 3 | public void setApplicationContext(ApplicationContext paramApplicationContext) throws BeansException{ appContext = paramApplicationContext; } |
然后就可以通过appContext.getBean(Class)来获取容器或者appContext.getBean(name,Class)来获取容器中的对象。
ApplicationContextAware 通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContext方法。
public class AppUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
SpringContextUtil.applicationContext = applicationContext;
}
可以通过注入AppUtil对象获取其中的applicationContext在其他类中使用。
通过setApplicationContext传过来的对象ApplicationContext 为容器的管理对象如果在方法中有需要提前初始化全局的对可以直接在SetApplicationContext方法中初始化。如下
private FlagConfiguration feature;
private ObjectFactory objectFactory;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
feature = applicationContext.getBean(FlagConfiguration.class); }
直接在setApplicationContext方法中初始化FlagConfiguration对象。
另外也可以继承ApplicationObjectSupport类之后调用getApplicationContext().getBean获取,如下:
Student student = getApplicationContext().getBean(Student.class);
其中ApplicationObjectSupport实现了ApplicationContextAware更好的管理application上下文,在需要的时候调用 getApplicationContext()更方便