当前位置: 首页 > news >正文

Spring Boot 项目瘦身实战

🌟 前言:为什么我们需要“项目瘦身”?

在企业级 Java 开发中,我们常常会引入一个名为 common 的共享模块 —— 它封装了工具类、异常体系、基础配置、通用服务等。初衷是“复用”,但现实往往是“污染”。

当你在 Spring Boot 项目中引入 common.jar,你会发现:

  • 启动变慢 —— 因为加载了大量无用的 @Service@Controller@Configuration
  • 内存暴涨 —— 因为注册了你不关心的 RedisTemplateKafkaProducerDataSource
  • 日志混乱 —— 初始化一堆你根本不会调用的 Bean
  • 依赖冲突 —— 比如你用 Lettuce,common 用 Jedis;你用 Jackson,common 用 Fastjson

删 JAR?不行 —— 你需要里面的工具类和 DTO。
改源码?不行 —— common 是团队共享,牵一发动全身。

于是,我们唯一的出路是:

💡 在不删除依赖、不修改源码的前提下,通过 Spring Boot 启动类,精准排除你不想要的自动配置与组件扫描 —— 实现“逻辑瘦身”。


🧭 解决方案总览:两步走战略

步骤 目标 手段 效果
第一步 物理层面移除无用依赖 pom.xml<exclusions> 删除 JAR,彻底移除类
第二步 逻辑层面阻止组件注册 @ComponentScan(excludeFilters = ...) 保留 JAR,但不让 Spring 扫描

✅ 第一步:pom.xml 排除依赖 —— 物理层面“断舍离”

适用于你100% 确定不会使用的底层依赖(如 Redis、Kafka、Batch 等)。

<dependency><groupId>com.yourcompany</groupId><artifactId>common</artifactId><version>1.0.0</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></exclusion><exclusion><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></exclusion></exclusions>
</dependency>

⚠️ 注意:此操作是“物理删除”,可能导致编译失败。仅适用于完全无关的功能模块。


✅ 第二步:启动类排除扫描 —— 逻辑层面“精准外科手术”

🎯 核心目标:JAR 保留,但不让 Spring 容器扫描、注册、初始化那些你不想要的组件。

这是本文的重点 —— 我们将深入剖析 @ComponentScan(excludeFilters = ...) 的所有能力,尤其是五种 FilterType 的实战用法。


🔍 深度解析:@ComponentScan 的 excludeFilters 机制

Spring Boot 默认会扫描启动类所在包及其子包下的所有 @Component@Service@Controller@Repository@Configuration 等注解类。

但我们可以用 excludeFilters 精准控制“哪些类不该被扫描”。

@ComponentScan(basePackages = "com.yourcompany.myproject", // 显式指定扫描范围excludeFilters = {// 在这里配置排除规则}
)

关键原则:显式指定 basePackages,避免误扫 common 包!


🧰 五种 FilterType 详解


1️⃣ FilterType.ANNOTATION —— 按注解排除

✅ 定义:

排除所有被指定注解标记的类。

🔧 语法:
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Deprecated.class

文章转载自:

http://DxMvlRye.ntqgz.cn
http://azrn0XQ7.ntqgz.cn
http://srr7IEmf.ntqgz.cn
http://sG1avd8q.ntqgz.cn
http://NUpixoIV.ntqgz.cn
http://M4rPFSlO.ntqgz.cn
http://TkcpNi8E.ntqgz.cn
http://ROFor2J4.ntqgz.cn
http://QtF7JRln.ntqgz.cn
http://2elwPQia.ntqgz.cn
http://MURveLw9.ntqgz.cn
http://qs3snhnA.ntqgz.cn
http://wiWtu8or.ntqgz.cn
http://rQG9THFo.ntqgz.cn
http://f9RCNG6s.ntqgz.cn
http://0q3Es5Zo.ntqgz.cn
http://7UShMwml.ntqgz.cn
http://y389RkGj.ntqgz.cn
http://KdDDh5eD.ntqgz.cn
http://bLpd1CPW.ntqgz.cn
http://Cr6nBNT2.ntqgz.cn
http://FKE2x1XI.ntqgz.cn
http://u2RSW4XO.ntqgz.cn
http://IpdDCpDK.ntqgz.cn
http://E8O7eQ5L.ntqgz.cn
http://KZqSbw4E.ntqgz.cn
http://2k1ICi51.ntqgz.cn
http://wcK7xlCS.ntqgz.cn
http://8mIMi34l.ntqgz.cn
http://tFwC23kR.ntqgz.cn
http://www.dtcms.com/a/383969.html

相关文章:

  • 【git基础】关于新仓库创建的几种方式
  • Dify 中的上下文变量以及它们与 system、user 变量的关系和配合方式
  • 【Android】可折叠式标题栏
  • Open cascade中如何使用BRepAlgoAPI_Splitter分割一个Face
  • JAVA开发知识合集6
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十二章知识点问答(15题)
  • 条件表达式和逻辑表达式
  • 《数据密集型应用系统设计2》--数据复制与数据分片
  • 【C++】揭秘:虚函数与多态的实现原理
  • 项目交付后知识沉淀断档怎么办
  • Spring事务传播行为全解析
  • OpenCV一些进阶操作
  • Layer、LayUI
  • 机器视觉光源的尺寸该如何选型的方法
  • MySQL 高阶查询语句详解:排序、分组、子查询与视图
  • Mathtype公式批量编号一键设置公式居中编号右对齐
  • CKS-CN 考试知识点分享(5) 安全上下文 Container Security Context
  • 简单的分数求和 区分double和float
  • Python核心技术开发指南(066)——封装
  • SFR-DeepResearch: 单智能体RL完胜复杂多智能体架构
  • 【Docker+Nginx+Ollama】前后端分离式项目部署(传统打包方式)
  • ffplay数据读取线程
  • 回溯剪枝的 “减法艺术”:化解超时危机的 “救命稻草”(二)
  • 16-21、从监督学习到深度学习的完整认知地图——机器学习核心知识体系总结
  • 二叉树的顺序存储
  • 第7课:本地服务MCP化改造
  • CF607B Zuma -提高+/省选-
  • DMA-API(map和unmap)调用流程分析(十一)
  • LeetCode 1898.可移除字符的最大数目
  • LeetCode算法日记 - Day 42: 岛屿数量、岛屿的最大面积