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.propertiesapplication.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 方法。

结语

ApplicationContextInitializer 是 Spring Boot 提供的一个强大的接口,它允许开发者有机会在应用上下文刷新之前,注入自定义的启动逻辑或预处理。通过合理地利用这个接口,可以提升应用的可配置性和灵活性。了解如何运用 ApplicationContextInitializer 可以让你在 Spring Boot 应用的早期启动阶段,有更多控制权。

云服务器/高防CDN推荐

蓝易云国内/海外高防云服务器推荐


免备案五网CN2云服务器:www.tsyvps.com

蓝易云安全企业级高防CDN:www.tsycdn.com

持有增值电信营业许可证:B1-20222080【资质齐全】

蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。

蓝易云是一家专注于香港及国内数据中心服务的提供商,提供高质量的服务器租用和云计算服务、包括免备案香港服务器、香港CN2、美国服务器、海外高防服务器、国内高防服务器、香港VPS等。致力于为用户提供稳定,快速的网络连接和优质的客户体验。
最后修改:2024 年 04 月 08 日
如果觉得我的文章对你有用,请随意赞赏