SpringBoot自动配置原理是三步联动:先扫描starter依赖,再根据条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty)判断是否加载配置类,最后将符合条件的@Configuration类中的@Bean注册进容器。

SpringBoot自动配置原理到底是怎么回事新手一问就懂——它不是魔法,而是靠三步联动:先扫描你项目里加了哪些starter依赖,再根据这些依赖对应的条件注解(比如类是否存在、配置是否开启)判断该不该加载某段配置代码,最后把符合条件的@Configuration类里的@Bean注册进Spring容器。整个过程不写一行XML,也不手动new对象,全由框架在启动时自动完成。
第一步:@SpringBootApplication是总开关
你在启动类上写的@SpringBootApplication,表面看只是个标记,实际是三个注解的组合体:【@EnableAutoConfiguration是真正触发自动配置的入口】。它通过@Import(AutoConfigurationImportSelector.class)告诉Spring:“接下来要从外部加载一批配置类”。没有这个注解,哪怕你引入了spring-boot-starter-web,Tomcat也不会自动启动。
另外两个注解各司其职:@SpringBootConfiguration等价于@Configuration,让你的启动类本身就能当配置类用;@ComponentScan负责把你写的@Controller、@Service这些组件扫进容器——但它们和自动配置无关,别混淆。
第二步:自动配置类从哪来?看META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
Spring Boot 3.x起已彻底废弃spring.factories文件,所有自动配置类必须声明在这个imports文件里。打开任意starter jar包(比如spring-boot-starter-web),你能找到这个路径下的文本文件,里面是一行行全限定类名:
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
这些就是Spring Boot内置的“配置说明书”。AutoConfigurationImportSelector会逐行读取,然后挨个评估是否满足加载条件。
第三步:条件注解决定谁生效
方法一:@ConditionalOnClass
检查类路径里有没有某个类。比如DispatcherServletAutoConfiguration顶部写着@ConditionalOnClass(DispatcherServlet.class),意味着只有你项目里有spring-webmvc这个jar,它才会被加载。删掉依赖,这个配置类直接跳过,不会报错也不会注册DispatcherServlet Bean。
方法二:@ConditionalOnMissingBean
确保你没自己定义同类型的Bean。比如DataSourceAutoConfiguration里用它保护数据源Bean:如果你已经在自己的@Configuration类里写了@Bean DataSource,那自动配置的DataSource就不会注册,避免冲突。
方法三:@ConditionalOnProperty
读取application.properties里的开关。例如@EnableConfigurationProperties注解本身受spring.boot.enableconfigurationproperties控制,设成false就能关掉属性绑定功能。
【所有条件必须同时满足,缺一不可】。一个配置类上有@ConditionalOnClass + @ConditionalOnProperty,两个条件都成立才加载;任一不满足,整块配置直接忽略,连日志都不会打。
第四步:自动配置类怎么写?以DataSourceAutoConfiguration为例
第一步:定义配置属性类,绑定application.yml中的spring.datasource.*前缀
第二步:写一个@Configuration类,用@EnableConfigurationProperties(DataSourceProperties.class)注入属性
第三步:在类里写@Bean方法,构造HikariDataSource实例,参数来自上一步的属性对象
第四步:给这个@Bean加上@ConditionalOnClass(HikariDataSource.class)和@ConditionalOnMissingBean(DataSource.class)双重保险
第五步:把该配置类全限定名写进META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
这五步走完,别人只要引入你的starter,不用写任何配置,就能直接@Autowired DataSource使用。

















