springboot自动配置依赖di机制实现条件化bean注册:@enableautoconfiguration通过autoconfigurationimportselector读取imports文件,加载带@conditional注解的@configuration类,按条件决定是否注册@bean,di则负责注入已注册的bean。

理解SpringBoot自动配置原理必须先厘清它和依赖注入(DI)的依存关系——没有Spring容器的DI能力,自动配置就只是静态代码堆砌;而没有自动配置,DI就只能靠开发者手写@Bean或XML去声明每个Bean。二者是“骨架”与“血肉”的配合:DI提供注入机制,自动配置决定“注入什么、何时注入、按什么条件注入”。
自动配置本质是条件化Bean注册
SpringBoot启动时,【@EnableAutoConfiguration会触发AutoConfigurationImportSelector扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件】,从中读取所有候选的xxxAutoConfiguration类。这些类本身是标准的@Configuration类,内部用@Bean方法定义Bean,但每个@Bean都裹着@Conditional系列注解。
比如RedisAutoConfiguration里有:
@Bean
@ConditionalOnClass(RedisOperations.class)
@ConditionalOnMissingBean(RedisTemplate.class)
public RedisTemplate
这行代码不是无条件执行的——只有当classpath存在RedisOperations类且容器中尚未存在RedisTemplate类型的Bean时,这个@Bean才会被注册进IoC容器。这就是自动配置对DI机制的“调度”:它不创造DI,而是用条件规则指挥DI该加载哪些Bean。
依赖注入是自动配置的执行载体
方法一:自动配置类中的@Bean方法返回对象,Spring容器通过反射调用该方法后,将返回实例作为Bean放入ApplicationContext,后续@Autowired就能按类型/名称注入。
方法二:自动配置类本身可能被@ComponentScan扫描到(如果它被标记为@Component或位于启动类同包下),此时它的@Bean方法仍生效,但类本身也成了一个普通Bean——不过这不是主流用法,官方autoconfigure模块里的配置类都只靠@Import引入,不依赖扫描。
注意:自动配置类里的@Bean方法若声明了形参,Spring会自动从容器中按类型匹配并注入依赖。例如DataSource初始化时需要PlatformTransactionManager,只要容器里有对应Bean,就会自动注入——这正是DI在自动配置流程中实时起作用的证明。
从依赖引入到Bean落地的完整链路
第一步:在pom.xml中添加spring-boot-starter-data-redis → Maven下载jar包,使RedisOperations等类进入classpath
第二步:SpringBoot启动,@EnableAutoConfiguration触发,读取spring-autoconfigure-metadata.properties和AutoConfiguration.imports,定位到RedisAutoConfiguration
第三步:条件评估器(ConditionEvaluator)运行@ConditionalOnClass(RedisOperations.class) → 成功通过
第四步:再评估@ConditionalOnMissingBean(RedisTemplate.class) → 容器为空,条件成立 → 执行redisTemplate()方法 → 返回新实例 → 注入ApplicationContext
第五步:你在@Service类里写private RedisTemplate redisTemplate; → Spring在创建该Service Bean时,发现字段类型匹配容器中已有的RedisTemplate Bean → 自动完成依赖注入











