欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
Spring 通篇源码 基于 spring-framework-4.1.7.RELEASE 版本。
简述
ApplicationContextInitializer是Spring初始化WebApplicationContext(ConfigurableApplicationContext及其子类)的回调接口,在WebApplicationContext(ConfigurableApplicationContext及其子类)的refresh()方法调用之前被调用。
通常用于对WebApplicationContext进行一些编程式初始化的Web应用程序中。例如:针对WebApplicationContext(ConfigurableApplicationContext)的environment,注册属性源或激活配置文件。参考ContextLoader和FrameworkServlet中支持定义contextInitializerClasses作为context-param或定义init-param。
自定义的ApplicationContextInitializer,除了实现ApplicationContextInitializer接口外。若实现了org.springframework.core.Ordered或被org.springframework.core.annotation.Order标记,在运行时会得到适当的排序,Order越小,执行优先级越高。
源码
ApplicationContextInitializer的实现很简单,只有一个initialize方法,其参数是ConfigurableApplicationContext或其子类的实例,表示Spring应用上下文,可以对其包含的信息进行处理。
package org.springframework.context;
public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
void initialize(C applicationContext);
}
自定义
首先需要定义一个类,实现ApplicationContextInitializer接口,代码如下:
package com.arhorchin.securitit.protocol.extend;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
/**
* @author Securitit.
* @note 自定义ApplicationContextInitializer.
*/
public class CustomerApplicationContextInitializer implements ApplicationContextInitializer {
/**
* logger.
*/
private Logger logger = Logger.getLogger(CustomerApplicationContextInitializer.class);
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
logger.info("WebApplicationContext-id:" + applicationContext.getId());
applicationContext.getEnvironment().getSystemProperties().put("defineKey", "defineValue");
}
}
例子中只是简单的获取了WebApplicationContext(ConfigurableApplicationContext)的id属性,同时设置WebApplicationContext(ConfigurableApplicationContext)的系统属性defineKey。
编写完CustomerApplicationContextInitializer以后,需要在web.xml中进行配置,如下:
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>
com.arhorchin.securitit.protocol.extend.CustomerApplicationContextInitializer
</param-value>
</context-param>
在启动Web应用时,就会在控制台打印如下日志,说明ApplicationContextInitializer扩展成功。
2020-08-19 23:01:51,624 INFO com.arhorchin.securitit.protocol.extend.CustomerApplicationContextInitializer.info:46 - WebApplicationContext-id:org.springframework.web.context.WebApplicationContext:/xxxx
排序
· 实现org.springframework.core.Ordered接口
package com.arhorchin.securitit.protocol.extend;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.Ordered;
/**
* @author Securitit.
* @note 自定义ApplicationContextInitializer.
*/
public class CustomerApplicationContextInitializer implements ApplicationContextInitializer, Ordered {
/**
* logger.
*/
private Logger logger = Logger.getLogger(CustomerApplicationContextInitializer.class);
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
logger.info("WebApplicationContext-id:" + applicationContext.getId());
applicationContext.getEnvironment().getSystemProperties().put("defineKey", "defineValue");
}
@Override
public int getOrder() {
return 1;
}
}
· 类上标记org.springframework.core.annotation.Order注解。
package com.arhorchin.securitit.protocol.extend;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;
/**
* @author Securitit.
* @note 自定义ApplicationContextInitializer.
*/
@Order(1)
public class CustomerApplicationContextInitializer implements ApplicationContextInitializer {
/**
* logger.
*/
private Logger logger = Logger.getLogger(CustomerApplicationContextInitializer.class);
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
logger.info("WebApplicationContext-id:" + applicationContext.getId());
applicationContext.getEnvironment().getSystemProperties().put("defineKey", "defineValue");
}
}
总结
ApplicationContextInitializer扩展点的实现相对比较简单,只要按照上面的步骤进行,就可以轻松的完成ApplicationContextInitializer的扩展,至于扩展点里面的逻辑实现,完全取决于业务逻辑的复杂度。
若文中存在错误和不足,欢迎指正!
本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!