Spring Boot 项目瘦身实战
🌟 前言:为什么我们需要“项目瘦身”?
在企业级 Java 开发中,我们常常会引入一个名为 common
的共享模块 —— 它封装了工具类、异常体系、基础配置、通用服务等。初衷是“复用”,但现实往往是“污染”。
当你在 Spring Boot 项目中引入 common.jar
,你会发现:
- 启动变慢 —— 因为加载了大量无用的
@Service
、@Controller
、@Configuration
- 内存暴涨 —— 因为注册了你不关心的
RedisTemplate
、KafkaProducer
、DataSource
- 日志混乱 —— 初始化一堆你根本不会调用的 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