Spring Boot自动配置

Spring Boot自动配置

一、核心思想与目标

自动配置是Spring Boot的基石 ,其核心目标是:根据项目中引入的依赖(JAR包)和预设的配置,自动、智能地组装和配置Spring应用所需的Bean ,实现 "约定大于配置" ,让开发者专注于业务逻辑,而非繁琐的框架配置。

二、自动配置的三大核心注解

自动配置的旅程始于主类上的 @SpringBootApplication。它是一个复合注解,主要由以下三个关键注解组成:

注解 核心职责 简要说明
@SpringBootConfiguration 标识配置类 本质上是@Configuration的变体,表明该类是一个Spring配置类。
@ComponentScan 组件扫描 默认扫描主类所在包及其子包下的@Component, @Service, @Repository, @Controller等注解的类。
@EnableAutoConfiguration 启用自动配置(核心) 这是自动配置的"总开关"。它通过@Import导入了一个关键的选择器类。
三、自动配置的工作原理(核心流程)

整个自动配置流程围绕 @EnableAutoConfiguration 展开,其核心是一个 "发现-加载-条件装配" 的过程。

第1步:触发与导入

  • 当应用启动时,@EnableAutoConfiguration 注解会通过 @Import 注解,导入一个核心选择器类:AutoConfigurationImportSelector

第2步:加载候选配置类(发现阶段)

  • AutoConfigurationImportSelector 会调用 SpringFactoriesLoader.loadFactoryNames() 方法。

  • 这个方法会扫描所有依赖JAR包META-INF/spring.factories 这个配置文件

  • 它查找配置文件中 EnableAutoConfiguration 这个Key 对应的所有值。这些值就是全限定类名 ,即一个个自动配置类 (例如:org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration)。

  • spring.factories 文件示例:

    复制代码
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.example.MyAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration

第3步:过滤与条件装配(核心中的核心)

  • 此时,Spring Boot获得了所有可能的自动配置类清单。但并非所有类都会生效。

  • 每个自动配置类上都标有大量的 @Conditional 及其衍生注解 (如 @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty)。

  • Spring Boot会逐一检查这些条件注解是否满足:

    • @ConditionalOnClass :类路径下存在指定的类时才生效。(例如,当存在DataSource.class时,数据源相关的自动配置才生效)。

    • @ConditionalOnMissingBean :当Spring容器中不存在 指定类型的Bean时才生效。(这为用户自定义Bean覆盖默认配置提供了可能)。

    • @ConditionalOnProperty:当指定的配置属性满足条件时才生效。

  • 只有全部条件都满足的自动配置类,才会被真正加载到Spring容器中。

第4步:注册Bean

  • 最终生效的自动配置类本身就是一个标准的 @Configuration 类。

  • 在这些类中,通过 @Bean 注解定义了一系列的Bean(如DataSource, DispatcherServlet, EntityManagerFactory等)。

  • 这些Bean被注册到Spring IOC容器中,从而完成了整个应用上下文的自动组装。

四、一个生动的例子:MyBatis-Spring-Boot-Starter
  1. 引入依赖 :你在 pom.xml 中添加 mybatis-spring-boot-starter

  2. 提供配置类 :该Starter的JAR包中包含 META-INF/spring.factories 文件,其中声明了自己的自动配置类,例如 MybatisAutoConfiguration

  3. 条件判断MybatisAutoConfiguration 类上可能标有 @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })。因为引入了Starter,这些类都在类路径下,条件满足

  4. 创建Bean :该配置类内部会使用 @Bean 注解,自动创建并配置 SqlSessionFactorySqlSessionTemplate 等MyBatis核心组件所需的Bean。

  5. 用户自定义 :如果你想覆盖默认配置,只需在自己的@Configuration类中,手动定义一个 SqlSessionFactory Bean。由于 @ConditionalOnMissingBean 的条件,Spring Boot将优先使用你定义的Bean,而不会使用自动配置提供的默认Bean。

相关推荐
范纹杉想快点毕业12 小时前
嵌入式系统架构之道:告别“意大利面条”,拥抱状态机与事件驱动
java·开发语言·c++·嵌入式硬件·算法·架构·mfc
2501_9403152612 小时前
【无标题】2390:从字符串中移除*
java·开发语言·算法
半聋半瞎12 小时前
Flowable快速入门(Spring Boot整合版)
java·spring boot·后端·flowable
散峰而望12 小时前
【算法竞赛】树
java·数据结构·c++·算法·leetcode·贪心算法·推荐算法
毕设源码-邱学长12 小时前
【开题答辩全过程】以 基于SpringBoot的理工学院学术档案管理系统为例,包含答辩的问题和答案
java·spring boot·后端
shejizuopin12 小时前
基于SSM的高校旧书交易系统的设计与实现(毕业论文)
java·mysql·毕业设计·论文·ssm·毕业论文·高校旧书交易系统的设计与实现
修己xj13 小时前
SpringBoot解析.mdb文件实战指南
java·spring boot·后端
没有bug.的程序员13 小时前
Spring Boot 与 XXL-JOB:分布式调度内核、任务分片与高可用报表实战指南
spring·springboot·xxl-job·分布式调度内核·任务分片·高可用报表
咩图13 小时前
Sketchup软件二次开发+Ruby+VisualStudioCode
java·前端·ruby
我命由我1234513 小时前
Android 开发问题:Duplicate class android.support.v4.app.INotificationSideChannel...
android·java·开发语言·java-ee·android studio·android-studio·android runtime