SpringBoot 3.3自动装配链路:@EnableAutoConfiguration→@Import AutoConfigurationImportSelector→读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports→filter()阶段执行@Conditional注解判断;exclude仅过滤imports声明的类,对@Bean间接引入或手动@Import无效。

面试官突然问你SpringBoot 3.3 Starter的自动装配链路、org.springframework.boot.autoconfigure.AutoConfiguration.imports文件作用、以及为什么exclude失效——你得立刻答出类加载时机和条件注解的执行顺序,不能只背@Import和@EnableAutoConfiguration。
Starter依赖如何触发自动配置类加载
第一步:SpringApplication.run()启动后,@EnableAutoConfiguration通过@Import导入AutoConfigurationImportSelector;
第二步:AutoConfigurationImportSelector读取所有jar包中META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(注意不是spring.factories);
第三步:逐行解析imports文件内容,每行是一个全限定名的自动配置类(如org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration),并封装为DeferredImportSelector.Group实例;
第四步:在refresh()阶段的ConfigurationClassPostProcessor处理时,调用group.process()→getAutoConfigurationEntry()→filter()→applyCondition(),此时才真正执行@ConditionalOnClass等条件判断;
这一步必须理解:imports文件只是声明“可能要加载”,条件判断发生在BeanDefinition注册前最后一刻,不是读取imports时就决定是否加载。
为什么@SpringBootApplication(exclude = X.class)有时不生效
方法一:exclude参数仅对imports文件中显式列出的自动配置类起作用;
方法二:若某自动配置类未被imports文件引用(比如被其他AutoConfiguration通过@Bean动态导入),exclude将完全无效;
方法三:排除时机在AutoConfigurationImportSelector.getAutoConfigurationEntry()内,但若该类已被其他路径(如@Import直接引入)提前注册,则exclude被绕过;
关键点:exclude只过滤imports来源,不拦截手动@Import或条件装配链中的间接引入。
自定义Starter必须包含的三个文件
1. pom.xml中声明
2. resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,每行写一个AutoConfiguration类全路径;
3. 自动配置类必须标注@Configuration + @AutoConfigureAfter(或@AutoConfigureBefore)+ 条件注解(如@ConditionalOnClass(YourService.class));
缺第2项,Spring Boot 3.3根本不会扫描你的配置类——spring.factories在3.0+已彻底废弃,不再被读取。
调试自动配置开关状态
在application.yml中添加:debug: true;
启动后控制台会输出两块内容:“Positive matches”(匹配成功的自动配置)和“Negative matches”(因条件不满足被跳过的配置);
查看Negative matches里具体哪条@ConditionalOnMissingBean没命中,就能快速定位Bean冲突或缺失依赖;
这比翻源码快得多,且能验证你写的条件注解是否按预期工作。
Starter中如何安全暴露可配置属性
方法一:定义配置属性类,用@ConfigurationProperties(prefix = "your.starter")标注,并在@EnableConfigurationProperties中注册;
方法二:在自动配置类上用@Validated + @ConfigurationPropertiesBinding声明绑定器;
方法三:直接在@Bean方法参数中注入带@DefaultValue的ConfigurationProperties对象(Spring Boot 3.3支持);
禁止在自动配置类里直接new Properties对象读取yml——无法响应spring.config.location重定向。

















