Spring 深入理解之ApplicationContextAw
一、概述
在某些类中我们经常需要通过ApplicationContext来获取需要的bean,但每一次使用new ClassPathXmlApplicationContext()都会重新装配文件并实例化上下文bean,这样肯定是很麻烦的,此时ApplicationContextAware接口的作用就体现出来了——spring会给实现此接口的类注入ApplicationContext对象。
ApplicationContextAware也是Spring提供的拓展性接口,可以让我们拿到 ApplicationContext实例
二、ApplicationContextAware
在spring项目中,类之间的关系是spring容器来管理的,但是一个项目中有些类不受spring容器管理,缺需要使用受spring管理的bean,这时候不能通过正常的方式注入bean,这时候spring给我们提供了ApplicationContextAware接口,我们可以编写一个工具类来实现ApplicationContextAware,通过工具类来获取我们需要的bean然后供不在spring容器中的类调用,具体代码如下:
public class ModuleManager {
public static ModuleManagerinstance =null;
private TskRunStateServiceImpltskRunStateService;
static {
instance =new ModuleManager();
}
public void loadBaseConfig() {
tskRunStateService = (TskRunStateServiceImpl) MyApplicationContext.Ctx.getBean("tskRunStateServiceImpl");
tskRunStateService.getByState();
}
}
分析:比如ModuleManager不受Spring管理,那么要实例化它的依赖tskRunStateService,我们就需要借助Spring的拓展接口 ApplicationContextAware。Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。
@Component
public class MyApplicationContextimplements ApplicationContextAware {
public static ApplicationContext Ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
System.out.println("applicationContext正在初始化,applicationContext:"+applicationContext);
Ctx = applicationContext;
Application.get().setContext(applicationContext);
}
}
备注:如果是在Spring管理的话直接可以通过注解注入来配置xml文件
@Configuration
@ImportResource(locations={"classpath:****.xml"})
public class ThreadPoolConfiguration {
}