Springboot中ApplicationContextInitializer的使用及源码分析

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

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 应用的早期启动阶段,有更多控制权。

目录
相关文章
|
Java Spring
springboot源码分析14-ApplicationContextInitializer原理Springboot中PropertySource注解多环境支持以及原理
摘要:Springboot中PropertySource注解的使用一文中,详细讲解了PropertySource注解的使用,通过PropertySource注解去加载指定的资源文件、然后将加载的属性注入到指定的配置类,@value以及@ConfigurationProperties的使用。
2203 0
|
Java 索引 Spring
springboot源码分析11-ApplicationContextInitializer原理
摘要:springboot源码分析10-ApplicationContextInitializer使用一文中,我们详细地讲解了ApplicationContextInitializer的三种使用方式,本文我们重点看一下为何这三种方式都可以使用,也就是框架是如何处理的。
2670 0
|
Java 测试技术 Spring
springboot源码分析10-ApplicationContextInitializer使用
摘要:spring中ApplicationContextInitializer接口是在ConfigurableApplicationContext刷新之前初始化ConfigurableApplicationContext的回调接口。
1728 0
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
2月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。
|
2月前
|
人工智能 Java 关系型数据库
基于springboot的画品交流系统
本项目构建基于Java+Vue+SpringBoot+MySQL的画品交流系统,旨在解决传统艺术交易信息不透明、流通受限等问题,融合区块链与AI技术,实现画品展示、交易、鉴赏与社交一体化,推动艺术数字化转型与文化传播。
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的高校运动会系统
本系统基于Spring Boot、Vue与MySQL,实现高校运动会报名、赛程安排及成绩管理的全流程信息化,提升组织效率,杜绝信息错漏与冒名顶替,推动体育赛事智能化发展。