Spring Boot 钩子全集实战(六):SpringApplicationRunListener.contextPrepared()详解

Spring Boot 钩子全集实战(六):SpringApplicationRunListener.contextPrepared()详解

在上一篇中,我们深入剖析了ApplicationContextInitializer这一容器初始化前的核心扩展点,实现了容器安全加固、Bean 定义预处理等高阶能力。今天,我们将继续跟进 Spring Boot 启动生命周期,解析SpringApplicationRunListener接口的又一关键方法contextPrepared()

一、什么是SpringApplicationRunListener.contextPrepared()

SpringApplicationRunListener.contextPrepared()是 Spring Boot 启动流程中,衔接ApplicationContextInitializerApplicationContext刷新前的关键回调方法,其触发时机和核心特征如下:

  • 触发时机ApplicationContext已创建完成、ApplicationContextInitializer已全部执行完毕,但容器尚未调用refresh()方法;
  • 核心状态:容器骨架已搭建,Bean 定义尚未加载,环境(Environment)已完全就绪;
  • 执行顺序:晚于ApplicationContextInitializer.initialize(),早于SpringApplicationRunListener.contextLoaded()和容器refresh()
  • 核心能力:可对ApplicationContext进行最终定制、添加容器级监听器、提前绑定资源、拦截 Bean 加载前置流程。

核心价值:作为容器刷新前的 “最后一道关卡”,它弥补了ApplicationContextInitializer与容器加载之间的扩展空白,可实现容器行为的最终校准、监听器动态注册等场景。

二、场景:容器启动权限校验(防止非授权环境 / 用户启动应用)

业务痛点

  1. 生产环境应用包可能被误拷贝到测试环境以外的非授权服务器(如员工本地机器、第三方服务器)启动,导致敏感配置泄露;
  2. 部分核心应用(如支付系统、用户中心)仅允许指定运维用户启动,普通用户启动可能引发操作风险;
  3. 传统权限校验多在 Bean 初始化后执行,此时容器已加载部分资源,校验失败后需额外清理,效率低下。

解决方案

利用contextPrepared()方法,在容器加载 Bean 前执行「服务器 IP 白名单校验」+「启动用户白名单校验」,校验失败直接终止应用启动,从源头阻断非授权访问。

步骤 1:实现权限校验逻辑(在contextPrepared()中)

修改CustomContextPreparedRunListener,添加权限校验逻辑:

packagecom.example.demo.listener;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.SpringApplicationRunListener;importorg.springframework.context.ConfigurableApplicationContext;importorg.springframework.core.env.ConfigurableEnvironment;importjava.net.InetAddress;importjava.net.UnknownHostException;importjava.util.Arrays;importjava.util.HashSet;importjava.util.Set;/** * 自定义 SpringApplicationRunListener,实现容器启动权限校验 */publicclassCustomContextPreparedRunListenerimplementsSpringApplicationRunListener{// 必须提供的构造方法publicCustomContextPreparedRunListener(SpringApplicationapplication,String[]args){}// 服务器 IP 白名单(生产环境可从配置中心动态拉取)privatestaticfinalSet<String>SERVER_IP_WHITELIST=newHashSet<>(Arrays.asList("192.168.1.100","192.168.1.101","172.16.0.50"// 生产授权服务器 IP));// 启动用户白名单(生产环境可从配置中心动态拉取)privatestaticfinalSet<String>USER_WHITELIST=newHashSet<>(Arrays.asList("prod_ops","admin","payment_admin"// 授权运维用户));/** * 核心方法:contextPrepared 实现启动权限校验 */@OverridepublicvoidcontextPrepared(ConfigurableApplicationContextcontext){System.out.println("[ContextPrepared] 开始执行容器启动权限校验...");ConfigurableEnvironmentenvironment=context.getEnvironment();StringcurrentEnv=environment.getActiveProfiles().length>0?environment.getActiveProfiles()[0]:"prod";// 仅对生产环境执行严格权限校验(开发/测试环境跳过)if("prod".equals(currentEnv)){try{// 1. 服务器 IP 白名单校验validateServerIp();// 2. 启动用户白名单校验validateStartupUser();System.out.println("[ContextPrepared] 权限校验通过,允许启动应用");}catch(SecurityExceptione){System.err.println("[ContextPrepared] 权限校验失败:"+e.getMessage());// 校验失败,直接终止 JVM 进程(避免容器继续加载资源)System.exit(1);}}else{System.out.println("[ContextPrepared] 当前为非生产环境("+currentEnv+"),跳过严格权限校验");}}/** * 服务器 IP 白名单校验 */privatevoidvalidateServerIp(){try{// 获取当前服务器本机 IPInetAddresslocalHost=InetAddress.getLocalHost();StringserverIp=localHost.getHostAddress();System.out.println("[ContextPrepared] 当前服务器 IP:"+serverIp);if(!SERVER_IP_WHITELIST.contains(serverIp)){thrownewSecurityException("当前服务器 IP("+serverIp+")不在授权白名单内,禁止启动");}}catch(UnknownHostExceptione){thrownewSecurityException("获取服务器 IP 失败:"+e.getMessage());}}/** * 启动用户白名单校验 */privatevoidvalidateStartupUser(){// 获取当前启动应用的操作系统用户StringcurrentUser=System.getProperty("user.name");System.out.println("[ContextPrepared] 当前启动用户:"+currentUser);if(!USER_WHITELIST.contains(currentUser)){thrownewSecurityException("当前用户("+currentUser+")不在授权白名单内,禁止启动");}}// 其他生命周期方法(省略)@OverridepublicvoidcontextLoaded(ConfigurableApplicationContextcontext){}@Overridepublicvoidfailed(ConfigurableApplicationContextcontext,Throwableexception){}}
步骤 2:注册 RunListener
org.springframework.boot.SpringApplicationRunListener=\ com.example.demo.listener.CustomContextPreparedRunListener
步骤3: 输出结果

非授权 IP 启动(生产环境):

[ContextPrepared] 开始执行容器启动权限校验... [ContextPrepared] 当前服务器 IP:127.0.0.1 [ContextPrepared] 权限校验失败:当前服务器 IP(127.0.0.1)不在授权白名单内,禁止启动
生产价值
  1. 校验时机早(容器加载 Bean 前),避免非授权启动后清理资源的额外开销,提升安全校验效率;
  2. 双重校验(IP + 用户),形成完整的启动权限管控体系,有效防止敏感应用被误启动或恶意启动;
  3. 支持环境差异化校验(仅生产环境严格校验),不影响开发 / 测试效率,兼顾安全性与易用性;
  4. 白名单可扩展为从配置中心动态拉取,无需修改代码即可更新授权列表,提升维护灵活性。

三、总结

SpringApplicationRunListener.contextPrepared()是 Spring Boot 启动流程中容器刷新前的最终定制入口,它承接ApplicationContextInitializer的执行结果,为容器加载 Bean 定义做好最后的准备。其与ApplicationContextInitializer配合,形成了 “容器创建 → 初始化 → 最终定制 → 加载 Bean” 的完整扩展链路,是构建高可用、高灵活度企业级应用的重要支撑。

📌关注我,每天 5 分钟,带你从 Java 小白变身编程高手!

👉 点赞 + 关注 + 转发,让更多小伙伴一起进步!

👉 私信 “SpringBoot 钩子源码” 获取完整源码!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1167994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术日报|Claude Code超级能力登顶,今日狂揽2000+星标

&#x1f31f; TrendForge 每日精选 - 发现最具潜力的开源项目 &#x1f4ca; 今日共收录 10 个热门项目&#xff0c;涵盖 50 种编程语言&#x1f310; 智能中文翻译版 - 项目描述已自动翻译&#xff0c;便于理解&#x1f3c6; 今日最热项目 Top 10 &#x1f947; obra/superpo…

RyTuneX(Win10/11系统优化工具)

RyTuneX是一款专为Windows 10和Windows 11系统打造的系统优化工具&#xff0c;基于WinUI 3框架构建&#xff0c;旨在帮助用户优化系统资源&#xff0c;提升设备性能&#xff0c;同时增强隐私保护。 软件功能 系统优化&#xff1a;支持一键性能调整&#xff0c;可禁用Superfetc…

HoRain云--掌握jQuery事件处理全攻略

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

普洛斯集团任命赵明琪为普洛斯中国首席执行官

、美通社消息&#xff1a;普洛斯集团(GLP Pte Ltd)宣布任命赵明琪为普洛斯中国首席执行官。赵明琪将向全球首席执行官梅志明汇报&#xff0c;她领导的中国管理团队都有深厚行业积累&#xff0c;以保证业务的连续性&#xff0c;并共同推动未来的成功。普洛斯中国前常务副董事长诸…

从脚本到服务:5 分钟通过 Botasaurus 将你的爬虫逻辑转化为 Web API

很多开发者对爬虫的认知还停留在“写一个 .py 脚本&#xff0c;跑完出个 CSV”的阶段。但在真实的业务场景中&#xff0c;爬虫往往需要作为微服务存在&#xff1a;通过 HTTP 调用、支持异步任务队列、拥有可视化监控后台。通常&#xff0c;这意味着你需要额外配置 FastAPI/Flas…

vue基于Python软件整合网站 flask django Pycharm

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路&#xff01;&#xff01;需要的小伙伴可以发链接或者截图给我 项目介绍 …

HoRain云--jQuery淡入淡出特效全解析

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

OTG最小改动!

如果要增加一个升级系统app,系统代码里有源代码直接改吗?就是最小改动的办法。OTA/Fota升级。 U盘刷机,工程测试程序好像有一个U盘更新OTA,但是需要插入U盘,我们设备是一个电源口,就是USB口,无法直接插USB读取文件的。那么这个需求要怎么加,最小改动? 如果要增加一个升…

HoRain云--JavaScript Switch语句详解与最佳实践

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…

vue基于Python 最美夕阳红老人服务站网站 flask django Pycharm

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路&#xff01;&#xff01;需要的小伙伴可以发链接或者截图给我 项目介绍 …

HoRain云--JavaScript while循环:从入门到精通

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…

数字化转型大数据安全方案(PPT)

大数据安全多层级保障体系方案大数据安全以“全生命周期防护”为核心&#xff0c;从技术防御、管理规范、生态协同三方面构建多层级保障体系&#xff0c;具体如下&#xff1a;一、技术防御&#xff1a;全流程分态防护与专项抵御分态精准防护静态数据&#xff1a;采用加密存储&a…

HoRain云--jQuery安装全指南:从CDN到本地

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

【风控】Boost和Bagging

一、Bagging 与 Boosting 概念对比 在风控建模中&#xff0c;单一模型&#xff08;如逻辑回归、决策树&#xff09;有时预测能力有限或易过拟合&#xff0c;集成方法通过组合多个弱模型提升稳定性和预测性能。特性Bagging&#xff08;Bootstrap Aggregating&#xff09;Boostin…

HoRain云--jQuery选择器全解析:高效定位DOM元素

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

HoRain云--jQuery 语法

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

计算机毕业设计|基于springboot + vue校园跑腿系统(源码+数据库+文档)

校园跑腿 目录 基于springboot vue校园跑腿系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue校园跑腿系统 一、前言 博主介绍&#xff1a;✌️大…

【单片机毕业设计】【dz-1131】基于单片机的家用煤气远程监测系统

一、功能简介项目&#xff1a;家用煤气远程监测系统 项目编号&#xff1a;dz-1131 单片机类型&#xff1a;STM32F103C8T6 具体功能&#xff1a; 1、通过MQ-5监测当前环境的煤气浓度&#xff0c;监测到煤气浓度大于最大值&#xff0c;自动关闭煤气阀门&#xff0c;同时声光报警 …

计算机毕业设计|基于springboot + vue大学生就业招聘系统(源码+数据库+文档)

大学生就业招聘 目录 基于springboot vue大学生就业招聘系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue大学生就业招聘系统 一、前言 博主介绍…

手把手AI论文神器实操指南:9款工具20分钟生成8万字带文献引用

一、论文写作痛点与AI工具选型对比表 作为常年和论文“死磕”的研究生&#xff0c;你是否也遇到过这些问题&#xff1a; 开题时对着空白文档发呆&#xff0c;不知道从哪下笔&#xff1f;导师批注密密麻麻&#xff0c;却抓不住核心修改方向&#xff1f;手动插入参考文献格式&a…