福州网站建设网站建设运营

北京淞争子青科技有限公司 2026/09/09 17:54:47

在企业级应用开发中,应用的启动过程往往需要进行精细化的控制和监控。Spring Boot 虽然提供了简化的启动方式,但在实际生产环境中,我们通常需要更多的启动信息、更好的错误处理和更优雅的启动管理。本文将详细介绍如何通过自定义事件监听器来优化 Spring Boot 应用的启动过程。

一、传统启动方式与优化启动方式对比

1.1 传统启动方式

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

这种方式虽然简洁,但缺乏对启动过程的控制,错误处理也不够完善。

1.2 优化后的启动方式

@Slf4j @EnableScheduling @SpringBootApplication public class Application { public static void main(String[] args) { try { SpringApplication application = new SpringApplication(Application.class); // 添加应用启动事件监听器 application.addListeners(new StartupEventListener()); application.run(args); log.info("================= The project has been launched ==========="); } catch (Exception e) { log.error("Application startup failed", e); System.err.println("Reason for startup failure: " + e.getMessage()); // 启动失败时退出应用 System.exit(1); } } }

二、启动优化详解

2.1 异常处理机制

优化后的启动代码添加了完整的异常处理机制:

  1. try-catch 块:捕获启动过程中的所有异常

  2. 详细日志记录:使用 log.error 记录完整的异常堆栈

  3. 控制台输出:向控制台输出简化的失败原因

  4. 优雅退出:启动失败时调用System.exit(1)确保应用完全退出

2.2 启动事件监听器

2.2.1 监听器实现
@Slf4j public class StartupEventListener implements ApplicationListener<WebServerInitializedEvent> { @Override public void onApplicationEvent(WebServerInitializedEvent event) { Environment environment = event.getApplicationContext().getEnvironment(); String appName = environment.getProperty("spring.application.name", "Unknown Application").toUpperCase(); int localPort = event.getWebServer().getPort(); String profile = StringUtils.arrayToCommaDelimitedString(environment.getActiveProfiles()); log.info("---[{}]--- Startup completed, current port: [{}],environment: [{}]---", appName, localPort, profile); } }
2.2.2 监听器功能解析
  • WebServerInitializedEvent:在 Web 服务器(Tomcat、Jetty 等)初始化完成后触发

  • 应用名称获取:从配置中读取spring.application.name,默认为"未知应用"

  • 端口信息获取:获取实际绑定的服务器端口

  • 环境信息获取:获取当前激活的 Spring Profile

  • 格式化输出:使用统一格式输出启动完成信息

2.3 配置详解

2.3.1 启动类注解
  • @Slf4j:Lombok 注解,自动生成日志对象

  • @EnableScheduling:启用定时任务功能

  • @SpringBootApplication:Spring Boot 核心注解,包含组件扫描、自动配置等功能

2.3.2 监听器注册

通过application.addListeners(new StartupEventListener())将自定义监听器注册到 Spring 应用上下文中,确保在适当的时间点被触发。

三、实际应用场景

3.1 多环境部署

在微服务架构中,通常会有多个环境(开发、测试、生产),通过监听器输出的环境信息可以快速确认应用当前运行的环境。

3.2 端口监控

当应用配置为随机端口或需要动态分配端口时,监听器可以准确输出实际使用的端口号,便于服务发现和注册。

3.3 启动状态监控

运维团队可以通过监听器输出的日志信息,监控应用的启动状态和成功率。

四、扩展与优化建议

4.1 多监听器支持

可以创建多个监听器,分别处理不同的启动阶段:

  • ApplicationStartingEvent:应用开始启动时

  • ApplicationEnvironmentPreparedEvent:环境准备完成时

  • ApplicationPreparedEvent:应用上下文准备完成时

  • ApplicationStartedEvent:应用启动完成时

  • ApplicationReadyEvent:应用准备就绪时

4.2 错误处理的进一步优化

  1. 分类处理异常:根据异常类型采取不同的处理策略

  2. 发送告警通知:启动失败时通过邮件、短信或即时通讯工具通知相关人员

  3. 记录诊断信息:收集系统状态、配置文件等信息,便于问题排查

4.3 性能监控集成

在启动过程中加入性能监控点,记录各阶段的耗时,为性能优化提供数据支持。

五、总结

通过自定义启动事件监听器和优化启动流程,我们可以获得以下收益:

  1. 更好的可观测性:详细的启动日志帮助快速定位问题

  2. 更健壮的启动过程:完善的异常处理确保启动失败时能够优雅退出

  3. 更丰富的启动信息:多维度信息输出满足不同角色的需求

  4. 更好的运维支持:为自动化运维和监控提供基础数据

  5. 更高的可维护性:清晰的代码结构和合理的职责分离

这种优化方式特别适合微服务架构、容器化部署和企业级应用场景,是构建可靠、可维护 Spring Boot 应用的重要实践之一。


完整的代码

StartupEventListener

package com.yang.listener; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; /** * 应用启动事件监听器 * 在Web服务器初始化完成后触发,输出应用启动信息 */ @Slf4j public class StartupEventListener implements ApplicationListener<WebServerInitializedEvent> { @Override public void onApplicationEvent(WebServerInitializedEvent event) { Environment environment = event.getApplicationContext().getEnvironment(); String appName = environment.getProperty("spring.application.name", "Unknown Application").toUpperCase(); int localPort = event.getWebServer().getPort(); String profile = StringUtils.arrayToCommaDelimitedString(environment.getActiveProfiles()); log.info("---[{}]--- Startup completed, current port: [{}],environment: [{}]---", appName, localPort, profile); } }
package com.yang; import com.hzys.listener.StartupEventListener; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @Slf4j @EnableScheduling @SpringBootApplication public class Application { public static void main(String[] args) { // SpringApplication.run(Application.class, args); try { SpringApplication application = new SpringApplication(Application.class); // 添加应用启动事件监听器 application.addListeners(new StartupEventListener()); application.run(args); log.info("================= The project has been launched==========="); } catch (Exception e) { log.error("Application startup failed", e); System.err.println("Reason for startup failure: " + e.getMessage()); // 启动失败时退出应用 System.exit(1); } } }



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

南京网站建设云南网站建设

LobeChat批量生成内容实践:营销文案自动化产出在电商大促季,市场团队需要为数百款新品撰写风格统一的推广文案——如果还靠人工逐条敲字,不仅效率低下

2026/06/30 12:32:01

网站制作建设建设行业网站

如何真正解决 Safari 中100vh的“伪全屏”陷阱?一个前端老手的实战复盘你有没有遇到过这样的场景:在 iPhone 上打开一个 H5 登录页,设计稿明

2026/06/30 14:10:39

网站建设论文荆门网站建设

模型微调是针对base模型的一种局部调整,让模型可以按照你想要的输出内容方式输出内容。从我们日常应用的角度来讲,模型微调其实主要起到两个用处(个人理解

2026/06/30 10:16:19

兰州网站建设惠州网站建设

高频测试中的隐形杀手:DUT寄生效应深度解析你有没有遇到过这样的情况?一款标称支持3GHz带宽的高速ADC,在实测中还没到2GHz,信噪比就断崖

2026/06/30 13:10:04

建设局网站邢台网站建设

一、测评背景与方法论数字人技术已从早期探索阶段迈向规模化落地。行业数据显示,2025 年生成式 AI 产生的数据占比将达到全球数据总量的 10%,人工智能整体产业规模突破

2026/06/30 10:27:20

网站建设一条龙网站建设教程视频

在生成式AI与语音交互技术快速发展的当下,如何高效构建低延迟、个性化、自然对话体验的智能语音Agent,已逐渐成为业界关注的焦点之一。智能语音Agent的应用领域广泛&#x

2026/06/30 12:27:31

宿迁网站建设襄樊网站建设

基础篇:第一个工作流 “Hello, n8n!”目标: 熟悉 n8n 界面,并学会最重要的技能——如何“看”到你的数据。上一篇我们用命令行“召唤”了n8n,这次我们“温柔”一点,用 

2026/06/30 11:47:27

中国建设银行官方网站摄影网站建设

POSIX IPC 深入解析1. 消息队列移除机制当使用msgctl(2)并带上IPC_RMID标志时,意味着调用者希望从系统中移除消息队列。此时,内核会遍历队列上的消息链表,释放与每个消息关联的内核

2026/06/30 12:47:33

律师网站建设网站建设一条龙

前言在 mysql 中,表中的列通常被称为‌字段‌,代表特定类型的数据(如整数、字符串等)。‌字段是表的基本组成部分,每个字段具有

2026/06/30 10:23:50

吉安网站建设鄂州网站建设

ParsecVDisplay虚拟显示器:解决远程办公与游戏串流的显示瓶颈【免费下载链接】parsec-vdd✨ Virtual super display, upto 4K 2160p&

2026/06/30 14:18:09