我们在使用Spring框架进行日常的项目开发的过程中,往往不是每一个地方都能将属性注入到我们想要的地方去的,比如在某个Utils的静态方法中使用到dao,或者某个对象每次都是在使用到的时候new一个新对象出来,就不能使用直接注入的功能了。这个时候就是我们需要封装springContext的时候了,而ApplicationContextAware就起了关键性的作用。
看到—Aware就知道是干什么的了,就是属性注入的,但是这个ApplicationContextAware的不同地方在于,实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来。
对这个
ApplicationContextAware
不太熟悉的同学不妨回忆一下Spring初始化bean的过程,里面Spring框架为我们预留了一个关键的钩子方法,ApplicationContextAware
便是其中一个,下面是详细的加载全过程:
- 调用 BeanNameAware 的 setBeanName 方法
- 调用 BeanFactoryAware 的 setBeanFactory 方法
- 调用 ApplicationContextAware 的 setApplicationContext
- 调用 InitializingBean 的 afterPropertiesSet 或者没有实现这个接口,但指定了@Bean(initMethod="不加括号的方法名"),会执行这个方法
- 调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法
- 调用 BeanPostProcessor 的 postProcessAfterInitialization 方法
- Bean 初始化完成,可以被使用
- 容器关闭前,调用 DisposableBean 的 destroy 方法
ApplicationContextAware
通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware
接口中的setApplicationContext
方法。
具体在使用时,我们在ApplicationContextAware的实现类中,就可以通过这个上下文环境对象得到Spring容器中的Bean。
下面举一个具体的Demo:
首先,我们定义一个SpringMasterdataContext
,实现ApplicationContextAware
接口,Spring会在容器加载的时候将applicationContext通过setApplicationContext方法注入进来。
public class SpringMasterdataContext implements ApplicationContextAware{
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
context = applicationContext;
}
//获得applicationContext
public static ApplicationContext getApplicationContext() {
//assertContextInjected();
return context;
}
public static void clearHolder(){
context=null;
}
//获取Bean
public static <T> T getBean(Class<T> requiredType){
//assertContextInjected();
return (T) getApplicationContext().getBean(requiredType);
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name){
assertContextInjected();
return (T) getApplicationContext().getBean(name);
}
public static Object getBean(String name) {
return context.getBean(name);
}
//判断application是否为空
public static void assertContextInjected(){
Validate.isTrue(context==null, "application未注入 ,请在springContext.xml中注入SpringHolder!");
}
}
为了将SpringMasterdataContext
托管给Spring框架,我们可以使用xml中定义一个bean的方式或者加@Component
注解到SpringMasterdataContext
类上都是可以的,这里给一个xml定义bean的例子:
<bean id="springMasterdataContext"
class="com.**.SpringMasterdataContext"
lazy-init="false" />
网友评论