惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
T
Tenable Blog
Project Zero
Project Zero
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
S
Schneier on Security
Scott Helme
Scott Helme
S
Securelist
Know Your Adversary
Know Your Adversary
Vercel News
Vercel News
IT之家
IT之家
V
V2EX
F
Fortinet All Blogs
Simon Willison's Weblog
Simon Willison's Weblog
K
Kaspersky official blog
博客园_首页
T
Tailwind CSS Blog
The GitHub Blog
The GitHub Blog
Spread Privacy
Spread Privacy
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
有赞技术团队
有赞技术团队
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cyberwarzone
Cyberwarzone
Google DeepMind News
Google DeepMind News
The Hacker News
The Hacker News
L
LINUX DO - 热门话题
Hugging Face - Blog
Hugging Face - Blog
博客园 - 三生石上(FineUI控件)
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CXSECURITY Database RSS Feed - CXSecurity.com
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
S
SegmentFault 最新的问题
AWS News Blog
AWS News Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Vulnerabilities – Threatpost

Honesty Blog

给大模型穿上“拘束衣”:从物理缺陷到 Agentic OS 的工程化实践 | Honesty Blog Harness + LLM Wiki + Spec 智能体驱动工作流(工程规范手册 + Onboarding 测试版) | Honesty Blog 优化Netlify,Vercel国内访问速度:基于 enhanced-FaaS-in-China 的多路加速 | Honesty Blog 2025火山引擎FORCE大会·冬 三大核心技术:AI原生时代的底层逻辑与实践路径 | Honesty Blog Caffeine AsyncCache:响应式架构下(WebFlux, R2DBC, ReactiveRedis)的缓存实践 | Honesty Blog 事件驱动:WebFlux、R2DBC,Lettuce Reactive Redis与虚拟线程下的高性能Web项目构建指南 | Honesty Blog "关于我"页面创作之旅 | Honesty Blog
Spring Boot项目启动优化 | Honesty Blog
Honesty · 2025-06-23 · via Honesty Blog

本文系统分析并优化了一个Spring Boot项目启动耗时高达280秒的问题。通过追踪各阶段耗时、识别瓶颈、优化分库分表加载逻辑、异步初始化耗时任务等手段,最终将启动耗时缩短至159秒,提升近50%。文章详细介绍了启动流程分析、性能热点识别、异步初始化设计等关键技术细节,为大型Spring Boot项目性能优化提供了参考。

一、引言

在现代软件开发中,Spring Boot因其强大的功能和简洁的配置而被广泛应用于企业级应用开发。然而,随着项目规模的不断扩大,Spring Boot项目的启动时间可能会变得越来越长,这不仅影响开发效率,还可能对生产环境的部署和维护带来挑战。本文将通过一个实际案例,深入剖析一个Spring Boot项目从启动耗时280秒优化到159秒的过程,揭示优化的核心技术和关键细节。

二、项目背景

该Spring Boot项目是一个典型的大型微服务应用,涉及多个模块、分库分表设计以及复杂的业务逻辑。在开发和测试环境中,项目启动时间长达280秒,严重影响了开发效率和测试速度。优化目标是将启动时间缩短至200秒以内,同时确保系统的稳定性和功能完整性。

三、启动流程分析

(一)Spring Boot启动流程概述

Spring Boot的启动流程主要集中在SpringApplication#run方法中。该方法通过一系列的监听器(SpringApplicationRunListener)来追踪启动过程中的各个阶段,包括加载配置文件、初始化上下文、实例化Bean等。以下是Spring Boot启动流程的简化时序图:

(二)自定义监听器追踪启动耗时

为了深入了解启动过程中的性能瓶颈,我们通过自定义SpringApplicationRunListener,利用Listener机制追踪各阶段的耗时情况。具体实现如下:

通过自定义监听器,我们发现refreshContext()方法耗时最长,尤其是finishBeanFactoryInitialization(beanFactory)方法,该方法负责实例化所有单例Bean,是启动性能的关键影响点。

四、性能热点识别

(一)Bean实例化耗时分析

在Spring Boot中,Bean的实例化是启动过程中的关键环节。通过实现InstantiationAwareBeanPostProcessor接口,我们可以在Bean实例化前后插入自定义逻辑,从而找到处理耗时的Bean。以下是实现代码:

通过上述实现,我们发现singletonDataSource Bean的实例化耗时最长,主要集中在createDataSource方法中。

(二)分库分表加载优化

singletonDataSource是一个分库分表的数据源,其耗时主要在createDataSource方法中。通过分析代码,我们发现该方法在初始化时会加载所有分表的配置信息。在测试环境中,分表数量较多,导致启动时间显著增加。

为了解决这一问题,我们将分表数量配置化,并在测试环境中减少分表数量。具体实现如下:

通过配置化分表数量,我们成功将测试环境的启动时间缩短了约30秒。

五、异步初始化设计

(一)异步初始化的必要性

在Spring Boot中,某些Bean的初始化过程可能非常耗时,尤其是在涉及网络请求、数据库操作或复杂计算时。为了进一步优化启动时间,我们将这些耗时的Bean初始化过程异步化。

(二)异步初始化实现

我们通过自定义AsyncInitListableBeanFactoryAsyncBeanFactoryInitializer,以及借助ApplicationContextInitializer接口和反射机制,实现异步初始化。以下是实现代码:

通过上述实现,我们将耗时的afterPropertiesSet()方法异步化,从而加速项目启动。

六、其他优化策略

(一)延迟加载Bean

在某些情况下,某些Bean可能并不需要在启动时立即加载。通过将这些Bean标记为延迟加载(@Lazy),可以进一步优化启动时间。例如:

(二)优化配置文件加载

配置文件的加载也是启动过程中的一个重要环节。通过优化配置文件的结构和加载方式,可以减少启动时间。例如,将配置文件拆分为多个小文件,并按需加载。

(三)减少不必要的依赖

项目中可能存在一些不必要的依赖,这些依赖可能会增加启动时间和内存占用。通过清理项目依赖,可以进一步优化启动性能。

七、优化效果评估

经过上述优化措施,项目启动时间从280秒缩短至159秒,优化效果显著。以下是优化前后的对比:

优化措施

优化前耗时(秒)

优化后耗时(秒)

节省时间(秒)

分库分表优化

30

10

20

异步初始化

50

20

30

延迟加载Bean

20

5

15

配置文件优化

15

10

5

总计

280

159

121

从上表可以看出,通过分库分表优化、异步初始化、延迟加载Bean和配置文件优化等措施,项目启动时间显著缩短。接下来,我们将深入探讨Spring Boot加载和Bean处理的细节。