SpringBoot 自动配置原理深度解析:@EnableAutoConfiguration

张开发
2026/4/13 14:36:53 15 分钟阅读

分享文章

SpringBoot 自动配置原理深度解析:@EnableAutoConfiguration
用过 SpringBoot 的都知道它最爽的地方就是「开箱即用」—— 不用手动配置 XML、不用繁琐整合依赖启动项目就能直接用不用像传统 Spring 项目那样写一堆配置文件才能整合 Tomcat、Redis、MyBatis 等组件。而这一切的核心就是 EnableAutoConfiguration 注解在背后默默撑腰它也是 SpringBoot 区别于传统 Spring 项目的核心特性之一。一、EnableAutoConfiguration 到底做了什么一句话总结自动扫描、自动配置、自动注入帮你省去手动配置的麻烦真正实现「约定大于配置」的设计理念。举个最直观的例子当你在 pom.xmlMaven或 build.gradleGradle中引入 spring-boot-starter-web 依赖后不用你写任何 XML 配置、不用手动注册 Tomcat 容器SpringBoot 就会自动配置 Tomcat 服务器默认端口 8080、DispatcherServletSpringMVC 核心前端控制器、HandlerMapping 等 SpringMVC 相关 Bean启动项目后直接就能访问接口再比如引入 spring-boot-starter-data-redis 依赖SpringBoot 会自动配置 RedisTemplate、StringRedisTemplate 等操作 Redis 的核心 Bean你直接用 Autowired 注入就能操作 Redis不用手动配置连接池、序列化方式等。而这一切便捷操作的触发点就是 EnableAutoConfiguration 注解——它就像一个「自动配置开关」开启后就能触发 SpringBoot 内置的一系列自动配置逻辑。二、SpringBoot 启动类的秘密我们写 SpringBoot 启动类时都会习惯性地在类上添加SpringBootApplication注解很多同学以为这只是一个「标记启动类」的注解其实它是一个「组合注解」内部包含了3个核心注解而 EnableAutoConfiguration 就是其中最关键的一个负责开启自动配置功能。拆解核心注解// SpringBootApplication 本质是3个注解的组合省略了部分元注解 SpringBootConfiguration // 等同于 Configuration标记当前启动类为 Spring 配置类 ComponentScan // 扫描当前启动类所在的包及子包下的所有 Bean如 Service、Controller、Component EnableAutoConfiguration // 核心开启 SpringBoot 自动配置功能 public class DemoApplication { public static void main(String[] args) { // 启动 SpringBoot 应用加载 Spring 上下文 SpringApplication.run(DemoApplication.class, args); } }注意事项如果启动类上只加 Configuration 和 ComponentScan不加 EnableAutoConfiguration那么 SpringBoot 就会变成一个普通的 Spring 项目不会自动配置任何组件——你引入的 web 依赖、redis 依赖都需要手动写配置才能使用这也能看出 EnableAutoConfiguration 的核心作用它是开启 SpringBoot 自动配置的「总开关」没有它就没有 SpringBoot 的「开箱即用」。三、自动配置核心原理EnableAutoConfiguration 的核心逻辑并不复杂本质就是「找到所有符合条件的自动配置类加载到 Spring 容器中完成 Bean 的自动注入」具体拆解为3步✅ 第一步加载自动配置类EnableAutoConfiguration 注解内部会借助 Spring 提供的「SpringFactoriesLoader」工具类去读取 classpath类路径下的META-INF/spring.factories文件——这个文件是 SpringBoot 内置的「自动配置类清单」里面存放着所有 SpringBoot 提前写好的自动配置类的全类名。可能有同学会问这个文件在哪里其实它存在于 spring-boot-autoconfigure 依赖中这个依赖会被所有 spring-boot-starter 依赖自动引入不用你手动添加打开这个文件就能看到大量的自动配置类比如• RedisAutoConfigurationRedis 相关组件的自动配置类负责配置 RedisTemplate、RedisConnectionFactory 等 Bean• WebMvcAutoConfigurationSpringMVC 相关的自动配置类负责配置 DispatcherServlet、视图解析器等• DataSourceAutoConfiguration数据源相关的自动配置类负责配置 DataSource数据库连接池等• MybatisAutoConfigurationMyBatis 相关的自动配置类负责配置 SqlSessionFactory、SqlSessionTemplate 等。简单说SpringBoot 开发团队提前为我们写好了所有常用组件的配置类把这些配置类的全类名存放在 spring.factories 文件中相当于一份「自动配置清单」当 EnableAutoConfiguration 开启后就会自动读取这份清单找到所有可用的自动配置类。✅ 第二步条件筛选按需配置读取到所有自动配置类后并不是所有类都会被加载到 Spring 容器中——SpringBoot 会通过「条件注解」判断当前项目是否需要这个自动配置避免加载无用的配置浪费资源。这也是 SpringBoot 自动配置的灵活性所在「按需加载适配不同场景」。最常用的3个条件注解1.ConditionalOnClass类存在条件——只有当前项目的类路径中存在某个指定的类才会加载该自动配置类。比如 RedisAutoConfiguration 上就有这个注解指定了 Redis 相关的类如 RedisConnectionFactory只有你引入了 redis 依赖类路径中才有这些类RedisAutoConfiguration 才会被加载如果没引入 redis 依赖这个配置类就会被跳过。2.ConditionalOnMissingBeanBean 缺失条件——只有 Spring 容器中没有某个指定的 Bean才会加载该自动配置类创建对应的 Bean。这也是「自定义配置覆盖自动配置」的核心原理比如你自己定义了一个 RedisTemplateSpring 容器中就有了这个 BeanRedisAutoConfiguration 中的默认 RedisTemplate 就不会再被创建。3.ConditionalOnProperty配置属性条件——根据配置文件application.yml/application.properties中的某个属性值决定是否加载该自动配置类。比如 RedisAutoConfiguration 中会判断 spring.redis.enabled 属性的值如果配置了 spring.redis.enabledfalse就不会加载 Redis 相关的自动配置默认情况下该属性为 true所以引入 redis 依赖后会自动配置。核心逻辑一句话概括你有我就不用你没有我就自动补你配置了我就按你的来你没配置我就按默认的来这也是「约定大于配置」的核心体现。✅ 第三步注入 Spring 容器完成自动配置经过第二步的条件筛选后那些符合当前项目场景的自动配置类会被 Spring 框架加载到 Spring 容器中相当于 Spring 自动执行了这些配置类中的代码同时这些自动配置类中定义的 Bean比如 RedisTemplate、DataSource、DispatcherServlet 等也会被自动创建并注入到 Spring 容器中。这一步完成后我们就可以直接在自己的代码中用 Autowired 注解注入这些 Bean不用手动创建、不用手动配置真正实现「开箱即用」。比如注入 RedisTemplate 操作 Redis注入 DataSource 操作数据库都是这个原理。四、验证自动配置不用懂复杂源码通过2个简单易操作的小案例就能直观感受到自动配置的作用同时掌握「自定义配置覆盖自动配置」「关闭指定自动配置」的实用技巧案例1自定义配置覆盖自动配置SpringBoot 自动配置的 RedisTemplate默认使用的是 JdkSerializationRedisSerializer 序列化方式这种方式序列化后的数据是二进制格式在 Redis 客户端中查看会是乱码实际开发中我们更常用 JSON 序列化方式。这时候我们就可以自定义一个 RedisTemplate覆盖 SpringBoot 的自动配置具体代码如下Configuration public class RedisConfig { // 自定义 RedisTemplate覆盖 SpringBoot 自动配置的默认 RedisTemplate Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) { RedisTemplateString, Object template new RedisTemplate(); // 配置 Redis 连接工厂 template.setConnectionFactory(factory); // 配置 JSON 序列化方式解决默认序列化乱码问题 GenericJackson2JsonRedisSerializer jsonSerializer new GenericJackson2JsonRedisSerializer(); // 设置 key 的序列化方式String 序列化 template.setKeySerializer(new StringRedisSerializer()); // 设置 value 的序列化方式JSON 序列化 template.setValueSerializer(jsonSerializer); // 设置 hash 类型 key 和 value 的序列化方式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jsonSerializer); // 初始化 RedisTemplate template.afterPropertiesSet(); return template; } }原理解析SpringBoot 自动配置的 RedisTemplate上面有 ConditionalOnMissingBean 注解意思是「只有容器中没有 RedisTemplate 类型的 Bean 时才会自动配置」而我们自定义了一个 RedisTemplate 并注入容器所以 SpringBoot 就不会再自动配置默认的 RedisTemplate而是使用我们自定义的配置——这就是「自定义配置覆盖自动配置」的核心逻辑日常开发中非常常用。案例2关闭指定自动配置有时候我们引入了某个依赖但不想让 SpringBoot 自动配置它比如引入了 mybatis-spring-boot-starter但想手动配置 MyBatis或者项目中不需要数据源自动配置这时候就可以通过 EnableAutoConfiguration 的 exclude 属性关闭指定的自动配置类。比如我们不想让 SpringBoot 自动配置数据源DataSource可以在启动类上添加 exclude 属性具体代码如下// 关闭数据源自动配置exclude 中传入要关闭的自动配置类的全类名 SpringBootApplication(exclude DataSourceAutoConfiguration.class) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }补充说明如果需要关闭多个自动配置类可以用数组形式传入比如 exclude {DataSourceAutoConfiguration.class, RedisAutoConfiguration.class}另外也可以在配置文件中配置 spring.autoconfigure.exclude 属性效果和注解方式一致比如spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration五、总结•1. 核心地位EnableAutoConfiguration 是 SpringBoot 自动配置的「总开关」被 SpringBootApplication 组合注解包含没有它SpringBoot 无法实现「开箱即用」•2. 核心流程自动配置的3个关键步骤——读取 META-INF/spring.factories 中的自动配置类清单 → 通过条件注解筛选符合场景的配置类 → 将符合条件的配置类及其中的 Bean 注入 Spring 容器•3. 灵活扩展开发中可通过「自定义 Bean Configuration」覆盖 SpringBoot 的自动配置也可通过 SpringBootApplication 的 exclude 属性或配置文件关闭指定的自动配置适配不同业务场景。其实自动配置的本质就是 SpringBoot 开发团队帮我们做了「重复、繁琐的配置工作」把常用组件的配置提前写好通过条件注解实现按需加载让我们不用关注底层配置专注于业务逻辑开发。理解了这个原理以后遇到「为什么引入依赖后自动配置没生效」「怎么自定义配置覆盖默认配置」「怎么关闭不需要的自动配置」等问题都能快速找到根因面试时被问到「SpringBoot 自动配置原理」直接把这3步流程说清楚就能轻松加分关注我后续持续分享 SpringBoot 底层干货、实战技巧从入门到进阶帮你吃透核心知识点高效搬砖

更多文章