news 2026/6/15 21:31:11

Spring Boot 钩子全集实战(一):构造与配置阶段

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 钩子全集实战(一):构造与配置阶段

Spring Boot 钩子全集实战(一):构造与配置阶段

在使用 Spring Boot 时,我们通常这样启动一个应用:

@SpringBootApplication public class DemoApplication { public static void void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

看起来简洁明了,对吧?但在这短短几行代码背后,Spring Boot 其实悄悄为我们预留了多个“钩子”,这些扩展点允许我们在应用启动的不同阶段注入自定义逻辑。

接下来,我将推出一个系列文章,带你系统掌握 Spring Boot 各个阶段的钩子机制。今天是第一篇:构造与配置阶段,通俗易懂、代码可运行!

一、什么是“构造与配置阶段”?

简单来说,就是你创建SpringApplication对象到执行run方法之前的这段时间。

这个阶段的关键特点是:还没有真正启动 Spring 容器!

二、该阶段的有哪些钩子?

在这一阶段,我们主要通过配置SpringApplication实例来注入自定义行为,常见钩子有:

钩子方法类型作用
addInitializers(...)方法调用手动添加ApplicationContextInitializer,用于在容器刷新前修改上下文
addListeners(...)方法调用手动添加ApplicationListener,监听 Spring 事件
setXXX(...)系列方法调用设置主类、Banner 模式、Web 类型等

三、 应用场景 + 代码示例

1.addInitializers(...)

应用场景
  • 在 Spring 容器刷新(refresh)之前,对ApplicationContext进行自定义配置,比如设置环境变量、注册自定义 Bean 定义、修改上下文的属性源等。
  • 适用于需要在容器初始化早期注入全局配置的场景,例如多环境配置增强、自定义属性加载、权限相关的上下文初始化等。
代码示例
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ApplicationContextInitializer;importorg.springframework.context.ConfigurableApplicationContext;importorg.springframework.core.env.ConfigurableEnvironment;@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplicationapplication=newSpringApplication(DemoApplication.class);// 自定义 ApplicationContextInitializerApplicationContextInitializer<ConfigurableApplicationContext>customInitializer=context->{// 获取环境配置ConfigurableEnvironmentenvironment=context.getEnvironment();// 新增自定义环境变量environment.getSystemProperties().put("custom.app.name","SpringHookDemo");// 打印初始化日志System.out.println("ApplicationContext 初始化前:添加自定义环境变量 custom.app.name");};// 添加初始化器(钩子方法)application.addInitializers(customInitializer);// 启动应用ConfigurableApplicationContextcontext=application.run(args);// 验证:获取并打印自定义变量StringappName=context.getEnvironment().getProperty("custom.app.name");System.out.println("启动后获取的自定义变量:"+appName);}}
执行结果
ApplicationContext 初始化前:添加自定义环境变量 custom.app.name 启动后获取的自定义变量:SpringHookDemo

2.addListeners(...)

应用场景
  • 监听 Spring Boot 生命周期中的核心事件(如ApplicationStartedEventApplicationReadyEventApplicationFailedEvent等),实现自定义的事件响应逻辑。
  • 典型场景:应用启动成功后发送通知(邮件 / 钉钉)、启动失败时记录告警日志、监听上下文刷新事件做数据预热等。
代码示例
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ApplicationListener;importorg.springframework.boot.context.event.ApplicationStartedEvent;importorg.springframework.boot.context.event.ApplicationReadyEvent;@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplicationapplication=newSpringApplication(DemoApplication.class);// 监听应用启动事件(Started:容器已启动,但未处理请求)ApplicationListener<ApplicationStartedEvent>startedListener=event->{System.out.println("事件监听:应用已启动(Started),开始初始化业务数据...");// 模拟:初始化缓存、加载字典数据等};// 监听应用就绪事件(Ready:可处理请求)ApplicationListener<ApplicationReadyEvent>readyListener=event->{System.out.println("事件监听:应用已就绪(Ready),发送启动成功通知...");// 模拟:调用通知接口、记录启动日志等};// 添加事件监听器(钩子方法)application.addListeners(startedListener,readyListener);// 启动应用application.run(args);}}
执行结果
事件监听:应用已启动(Started),开始初始化业务数据... 事件监听:应用已就绪(Ready),发送启动成功通知...

3.setXXX(...)系列方法

应用场景
  • setMainApplicationClass(Class<?> mainApplicationClass):手动指定应用主类(默认自动识别,特殊场景下需显式指定);
  • setBannerMode(Banner.Mode mode):控制启动 Banner 的显示(关闭 / 控制台 / 日志文件);
  • setWebApplicationType(WebApplicationType type):指定应用的 Web 类型(NONE:非 Web 应用、SERVLET:Servlet 容器、REACTIVE:响应式 Web);
  • setAdditionalProfiles(String... profiles):设置额外的激活配置文件(如测试 / 生产环境)。
代码示例(常用 set 方法组合)
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.WebApplicationType;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.Banner;@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplicationapplication=newSpringApplication(DemoApplication.class);// 1. 关闭启动 Bannerapplication.setBannerMode(Banner.Mode.OFF);// 2. 指定为非 Web 应用(即使引入 Web 依赖,也不会启动 Tomcat 等容器)application.setWebApplicationType(WebApplicationType.NONE);// 3. 激活 test 配置文件application.setAdditionalProfiles("test");// 4. 手动指定主类(可选,默认自动识别)application.setMainApplicationClass(DemoApplication.class);// 启动应用application.run(args);System.out.println("非 Web 应用启动完成,激活的配置文件:test");}}
执行结果
非 Web 应用启动完成,激活的配置文件:test

(注:启动时不会显示 Spring Boot 的默认 Banner,也不会启动 Tomcat 容器)

四、总结

  1. addInitializers核心作用是容器刷新前修改上下文,适用于早期全局配置注入;
  2. addListeners用于监听 Spring 事件,实现启动 / 运行阶段的自定义响应逻辑;
  3. setXXX系列是配置 SpringApplication 核心属性,覆盖 Banner、Web 类型、配置文件等基础行为。

这些钩子均在SpringApplication.run()执行前调用

📌关注我,每天5分钟,带你从 Java 小白变身编程高手!
👉 点赞 + 关注+转发,让更多小伙伴一起进步!

👉 私信"SpringBoot钩子源码" 获取源码!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:50:11

【Java毕设全套源码+文档】基于springboot的厨具厂产品在线销售系统设计与实现小程序(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/15 21:26:33

如何构建专业的NAND闪存数据恢复工作站:NANDO开源方案详解

面对电子设备中NAND闪存芯片损坏导致的数据丢失问题&#xff0c;传统的维修方法往往束手无策。NANDO开源编程器项目提供了一个完整的技术解决方案&#xff0c;让你能够自主搭建专业级的数据恢复工作站。本文将从实际应用场景出发&#xff0c;详细介绍如何利用这一工具进行高效的…

作者头像 李华
网站建设 2026/6/15 14:24:55

Java Excel性能优化实战:用FastExcel突破大数据处理瓶颈

Java Excel性能优化实战&#xff1a;用FastExcel突破大数据处理瓶颈 【免费下载链接】fastexcel Generate and read big Excel files quickly 项目地址: https://gitcode.com/gh_mirrors/fas/fastexcel 在日常开发中&#xff0c;你是否曾经为Excel文件的处理效率而头疼&…

作者头像 李华
网站建设 2026/6/15 14:25:05

安全性测试之Burp Suite的使用

1.概述1.1 Burp Suite1.2 主要功能1.3 安装步骤2.常用模块功能介绍2.1Proxy2.1.1Burp Suite代理设置步骤&#xff1a;2.1.2截包功能2.2Target2.2.1导航功能2.2.2黑名单/白名单功能2.3Spider2.3.1被动爬网2.3.2主动爬网2.4Scanner主动扫描2.5Intruder暴力破解2.6Repeater抓包后修…

作者头像 李华
网站建设 2026/6/15 14:15:11

Tube MPC终极指南:从零开始掌握鲁棒控制核心技术

Tube MPC终极指南&#xff1a;从零开始掌握鲁棒控制核心技术 【免费下载链接】robust-tube-mpc An example code for robust model predictive control using tube 项目地址: https://gitcode.com/gh_mirrors/ro/robust-tube-mpc 在当今复杂的工业控制环境中&#xff0c…

作者头像 李华
网站建设 2026/6/15 8:15:59

OpenCore Legacy Patcher实战指南:老Mac升级最新macOS的完整解决方案

OpenCore Legacy Patcher实战指南&#xff1a;老Mac升级最新macOS的完整解决方案 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为2012年之前的Mac无法体验最新macOS…

作者头像 李华