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的使用。
2079 0
|
Java 索引 Spring
springboot源码分析11-ApplicationContextInitializer原理
摘要:springboot源码分析10-ApplicationContextInitializer使用一文中,我们详细地讲解了ApplicationContextInitializer的三种使用方式,本文我们重点看一下为何这三种方式都可以使用,也就是框架是如何处理的。
2564 0
|
Java 测试技术 Spring
springboot源码分析10-ApplicationContextInitializer使用
摘要:spring中ApplicationContextInitializer接口是在ConfigurableApplicationContext刷新之前初始化ConfigurableApplicationContext的回调接口。
1622 0
|
21天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
113 1
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
135 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
2月前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
184 1
|
6天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
84 62
|
3天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
13 2
|
6天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
183 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统