SpringBoot 的自动装配核心是基于注解驱动 + 约定大于配置,实现了无需手动编写大量配置就能完成 Bean 的自动注册,整体原理可以分为 3 个核心步骤,同时要注意版本差异:
注解入口触发:启动类的@SpringBootApplication是一个复合注解,核心依赖其中的@EnableAutoConfiguration(开启自动装配),这个注解会通过@Import(AutoConfigurationImportSelector.class)导入核心选择器类,作为自动装配的入口;
配置类扫描加载:AutoConfigurationImportSelector的核心方法(selectImports)会去扫描类路径下的自动配置类全类名,这里有版本差异:SpringBoot2.7.x 及以前扫描META-INF/spring.factories中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的全类名;2.7.x 以后废弃了spring.factories,改为扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的全类名,扫描后会将这些全类名加载到容器中;
条件装配实现按需加载:扫描到的全类名都是 SpringBoot 内置的自动配置类(如DataSourceAutoConfiguration、WebMvcAutoConfiguration),这些类上都标注了一系列条件注解,核心的有@ConditionalOnClass(类路径下存在指定类才生效,比如引入了 spring-web 才加载 WebMvc 自动配置)、@ConditionalOnMissingBean(容器中不存在指定 Bean 才自动注册,保证用户自定义 Bean 优先,体现扩展优先级)、@ConditionalOnProperty(配置文件中存在指定属性且值匹配才生效,比如spring.datasource.url配置后才加载数据源自动配置),通过这些条件注解,实现了按需加载,只有满足条件的自动配置类才会真正生效,注册对应的 Bean 到 IOC 容器中。
整体来说,自动装配的本质就是 **“注解触发→扫描配置→条件过滤→自动注册 Bean”**,核心是通过约定的配置文件和条件注解,实现了 “引入依赖即生效,自定义配置可覆盖” 的特性。
面试延伸考点(面试官大概率追问,提前准备)
回答完核心原理后,面试官大概率会追问以下 1-2 个问题,提前掌握能大幅提分:
@SpringBootApplication的其他核心注解是什么? 答:复合注解,除了@EnableAutoConfiguration,还有@SpringBootConfiguration(本质是@Configuration,标记启动类为配置类)、@ComponentScan(扫描当前包及子包下的 @Component/@Service/@Controller 等注解);
用户自定义配置如何覆盖 SpringBoot 的自动配置? 答:核心是@ConditionalOnMissingBean,用户自定义的 Bean(如自己写的DataSourceConfig)会优先于自动配置类注册,自动配置类检测到容器中已有该 Bean 则不会重复注册;也可以通过@EnableAutoConfiguration(exclude = XXXAutoConfiguration.class)手动排除指定自动配置类;
AutoConfigurationImportSelector的执行流程中,是否有过滤步骤? 答:有,除了条件注解,还会通过AutoConfigurationMetadata过滤掉无效的自动配置类,同时支持通过spring.autoconfigure.exclude配置项在 application.yml/properties 中排除指定自动配置类;
什么是 “约定大于配置”?结合自动装配举例说明 答:约定即 SpringBoot 定义的默认规则,配置即用户自定义配置。比如引入spring-boot-starter-web依赖后,SpringBoot 会默认约定端口 8080、上下文路径 /、使用 Tomcat 容器,用户无需手动配置;如果需要修改,只需在 application.yml 中配置server.port=8081即可覆盖默认约定,这就是 “约定大于配置”。
快速优化(如果不想背长文,极简版)
如果面试时想简洁回答,在你原回答基础上做小修改即可,保证逻辑和精准度:
SpringBoot 的自动装配核心是启动类@SpringBootApplication中的@EnableAutoConfiguration注解,该注解通过导入AutoConfigurationImportSelector实现自动装配的触发;这个选择器会扫描类路径下的自动配置类全类名,版本差异为 2.7 前扫描META-INF/spring.factories,2.7 后扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports;扫描到的自动配置类上标注了@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty等条件注解,通过这些注解实现按需加载,只有满足条件的自动配置类才会生效,完成 Bean 的自动注册,这就是自动装配的核心原理。
评论前必须登录!
注册