Spring Boot 项目瘦身实战

发布于:2025-09-16 ⋅ 阅读:(24) ⋅ 点赞:(0)

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

在企业级 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