ApplicationContextInitializer接口的源码解读

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上下文进行修改

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值