Springboot中ApplicationContextInitializer的使用及源码分析

ApplicationContextInitializer 是 Spring Boot 中的一个接口, 它提供了在 ConfigurableApplicationContext 类型的应用上下文进行刷新之前进行初始化的钩子。简而言之,可以通过实现 ApplicationContextInitializer 接口在 Spring Boot 启动阶段的早期,对应用上下文进行预配置或初始化。

使用场景

使用 ApplicationContextInitializer 主要用于如下场景:

  1. 环境敏感配置:在应用上下文刷新之前,根据不同的环境配置更改 Environment 属性,例如动态设置配置文件的激活或属性覆写。
  2. 上下文自定义:对 ConfigurableApplicationContext 的配置进行定制,比如注册自定义的 BeanDefinition 或处理器。
  3. 日志或基础设施引导:在应用上下文加载之前进行日志框架的初始化或者设置必要的基础设施。
  4. 条件检查:在应用上下文加载前,进行某些条件的检查,如系统资源的可用性等。

实现方式

想要使用 ApplicationContextInitializer,你需要创建一个实现了该接口的类,并重写 initialize 方法,然后注册到 Spring Boot 应用中。

public class MyApplicationContextInitializer 
        implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        // 初始化逻辑
        System.out.println("Initializing application context!");
        // 例如,可以修改 Environment 中的属性
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        environment.getPropertySources().addFirst(new MapPropertySource("myInitializerProperties", 
            Collections.singletonMap("app.initializer.customProperty", "initializedValue")));
    }
}
 
 

注册过程

要将 MyApplicationContextInitializer 注册到 Spring Boot 应用中,可以使用以下方法:

  1. 在 application.properties或 application.yml文件中配置
# application.properties
context.initializer.classes=com.example.MyApplicationContextInitializer
 
 

# application.yml
spring:
  application:
    name: example-app
  context:
    initializer:
      classes: com.example.MyApplicationContextInitializer
 
 
  1. 通过SpringApplicationBuilder编程方式设置
new SpringApplicationBuilder()
    .sources(YourApplication.class)
    .initializers(new MyApplicationContextInitializer())
    .run(args);
 
 
  1. 通过Spring Boot Manifest文件

在 Spring Boot 的 JAR 文件中的 META-INF/spring.factories 文件里添加:

org.springframework.context.ApplicationContextInitializer=\
com.example.MyApplicationContextInitializer
 
 

源码分析

在 Spring Boot 启动过程中,SpringApplication 类的 prepareContext 方法会遍历所有注册的 ApplicationContextInitializer 实例,并依此调用它们的 initialize 方法。这个逻辑主要包含在以下源码片段:

private void applyInitializers(ConfigurableApplicationContext context) {
    for (ApplicationContextInitializer initializer : getInitializers()) {
        Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(initializer.getClass(),
                ApplicationContextInitializer.class);
        Assert.isInstanceOf(requiredType, context, "Unable to call initializer.");
        initializer.initialize(context);
    }
}
 
 

在这段代码里,getInitializers 方法获取了所有注册的 ApplicationContextInitializer 实例,然后遍历这些实例并调用它们的 initialize 方法。

posted @   kiyte  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示