@springbootapplication是自动配置的总开关,其嵌套的@enableautoconfiguration通过@import(autoconfigurationimportselector)触发自动配置类加载,后者利用springfactoriesloader读取meta-inf/spring.factories中org.springframework.boot.autoconfigure.enableautoconfiguration对应的配置类,并按条件(如@conditionalonclass)决定是否注入bean。

想弄懂Spring Boot自动配置原理却不知从哪一行代码下手,翻源码像看天书,查资料全是术语堆砌——这种情况很常见,其实根本不需要一上来就啃AutoConfigurationImportSelector的源码。
先从启动类上的那个注解开始
打开你的Spring Boot项目,找到带有main方法的启动类,确认它标注了【@SpringBootApplication】。这个注解不是装饰用的,它是整个自动配置流程的总开关。
右键→“Go to Declaration”(或按Ctrl+Click),直接跳转到该注解定义处。你会立刻看到它由三个核心注解组成:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。
此时把光标停在【@EnableAutoConfiguration】上再点进去——这是你今天唯一需要深挖的注解。其他两个暂时不用管。
重点盯住@Import引入的那个类
在@EnableAutoConfiguration的源码里,你会看到这行关键代码:@Import(AutoConfigurationImportSelector.class)。
这就是自动配置的真正入口:Spring Boot不是靠魔法,而是靠这个类在应用启动早期,主动把一堆配置类“选出来并塞进容器”。
现在立刻跳转到AutoConfigurationImportSelector类,不要读全篇,只定位到它的selectImports()方法——这个方法返回一个String数组,里面全是自动配置类的全限定名,比如DataSourceAutoConfiguration、WebMvcAutoConfiguration。
顺着getCandidateConfigurations()追到底
在selectImports()方法内部,第一件关键事就是调用getCandidateConfigurations()。
点进去,你会发现它最终调用了SpringFactoriesLoader.loadFactoryNames(),并传入了EnableAutoConfiguration.class作为参数。
这一步会去扫描所有jar包里的【META-INF/spring.factories】文件,把其中key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的value全部加载进来——这些value就是成百上千个自动配置类的类名。
你可以在自己项目的spring-boot-autoconfigure依赖jar包里,直接解压找到这个文件,用记事本打开看一眼。里面第一行大概率就是org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration。
最后看一个具体配置类怎么生效
随便挑一个你熟悉的场景,比如Web接口能直接访问,说明WebMvcAutoConfiguration起了作用。
找到这个类,观察它的顶部是否有类似@ConditionalOnClass(DispatcherServlet.class)或@ConditionalOnWebApplication(type = Type.SERVLET)这样的注解。
这就解释了为什么你没写任何MVC配置,Spring Boot却自动配好了DispatcherServlet:只要类路径里有spring-webmvc的jar,且当前是Servlet型应用,这个配置类就会被加载。
方法一:打开WebMvcAutoConfiguration,搜索@Bean,你会看到它直接定义了requestMappingHandlerMapping、viewResolver等Bean;
方法二:在启动日志里加--debug参数运行项目,控制台会打印出所有“Positive matches”(成功匹配)和“Negative matches”(被跳过)的自动配置项,找WebMvcAutoConfiguration那一行,看它为什么被选中。











