ApplicationContextInitializer接口的作用:
可以在spring的上下文ApplicationContext初始化之前,即wac.refresh()之前修改spring上下文属性。源码如下
configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac){
.
.
.
postProcessWebApplicationContext(wac);
applyInitializers(wac);
wac.refresh();
}
applyInitializers(wac);
protected void applyInitializers(ConfigurableApplicationContext wac) {
String globalClassNames = getServletContext().getInitParameter(ContextLoader.GLOBAL_INITIALIZER_CLASSES_PARAM);
if (globalClassNames != null) {
for (String className : StringUtils.tokenizeToStringArray(globalClassNames, INIT_PARAM_DELIMITERS)) {
this.contextInitializers.add(loadInitializer(className, wac));
}
}
if (this.contextInitializerClasses != null) {
for (String className : StringUtils.tokenizeToStringArray(this.contextInitializerClasses, INIT_PARAM_DELIMITERS)) {
this.contextInitializers.add(loadInitializer(className, wac));
}
}
AnnotationAwareOrderComparator.sort(this.contextInitializers);
for (ApplicationContextInitializer<ConfigurableApplicationContext> initializer : this.contextInitializers) {
initializer.initialize(wac);
}
}
String globalClassNames = getServletContext().getInitParameter(ContextLoader.GLOBAL_INITIALIZER_CLASSES_PARAM);
这行代码意思是从servlet上下文中获取属性,所以必须保证在web.xml中必须配置了该属性,且必须有spring配置文件加载,即通过监听方式加载配置文件的方式。
<context-param>
<param-name>globalInitializerClasses</param-name>
<param-value>com.zhuguang.jack.applicationContextInitializer.MyApplicationContextInitializer</param-value>
</context-param>
如果没有
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
监听加载配置文件的方式,即使配置了该属性,代码中也获取不到。切记,切记
loadInitializer(className, wac)把web.xml中配置的类实例化
for (ApplicationContextInitializer<ConfigurableApplicationContext> initializer : this.contextInitializers) { initializer.initialize(wac); }
调用initialize方法,可以对spring上下文进行修改