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的使用。
2072 0
|
Java 索引 Spring
springboot源码分析11-ApplicationContextInitializer原理
摘要:springboot源码分析10-ApplicationContextInitializer使用一文中,我们详细地讲解了ApplicationContextInitializer的三种使用方式,本文我们重点看一下为何这三种方式都可以使用,也就是框架是如何处理的。
2552 0
|
Java 测试技术 Spring
springboot源码分析10-ApplicationContextInitializer使用
摘要:spring中ApplicationContextInitializer接口是在ConfigurableApplicationContext刷新之前初始化ConfigurableApplicationContext的回调接口。
1611 0
|
25天前
|
SQL 前端开发 NoSQL
SpringBoot+Vue 实现图片验证码功能需求
这篇文章介绍了如何在SpringBoot+Vue项目中实现图片验证码功能,包括后端生成与校验验证码的方法以及前端展示验证码的实现步骤。
SpringBoot+Vue 实现图片验证码功能需求
|
24天前
|
JavaScript
SpringBoot+Vue+ElementUI 实现视频播放 轮播图效果
这篇文章介绍了如何在SpringBoot+Vue+ElementUI项目中使用vue-awesome-swiper插件实现视频播放轮播图效果,包括安装插件、引入项目和使用案例的步骤。
SpringBoot+Vue+ElementUI 实现视频播放 轮播图效果
|
24天前
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
24天前
|
缓存 前端开发 JavaScript
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
这篇文章介绍了一个使用SpringBoot+Vue开发的前后端分离商城系统,包括技术架构、开发环境、实现的功能以及项目截图,并展示了普通用户和商家端的功能界面。
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
|
24天前
|
JavaScript Java 关系型数据库
美妆商城系统 SpringBoot + Vue 【毕业设计 资料 + 源码】
这篇文章介绍了一个使用SpringBoot + Vue + Mybatis + Mysql技术栈开发的美妆商城系统,包括系统功能划分、部分页面截图和前后端源码示例,并提供了GitHub上的源码链接。
美妆商城系统 SpringBoot + Vue 【毕业设计 资料 + 源码】
|
15天前
|
JavaScript 前端开发 小程序
【项目实战】SpringBoot+vue+iview打造一个极简个人博客系统
这是一个基于 SpringBoot+MybatisPlus+Vue+Iview 技术栈构建的个人极简博客系统,适合初学者实战练习。项目包含文章分类、撰写文章、标签管理和用户管理等功能,代码简洁并配有详细注释,易于上手。此外,该项目也可作为毕业设计的基础进行二次开发。
61 0
【项目实战】SpringBoot+vue+iview打造一个极简个人博客系统
|
21天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
在数字化时代背景下,本文详细介绍了如何使用Spring Boot框架结合Vue.js技术栈,实现一个前后端分离的考试管理系统。该系统旨在提升考试管理效率,优化用户体验,确保数据安全及可维护性。技术选型包括:Spring Boot 2.0、Vue.js 2.0、Node.js 12.14.0、MySQL 8.0、Element-UI等。系统功能涵盖登录注册、学员考试(包括查看试卷、答题、成绩查询等)、管理员功能(题库管理、试题管理、试卷管理、系统设置等)。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)