📚 分类
spring
🕵🏽‍♀️ 问题描述
springBoot自动配置原理
👨‍🏫 问题讲解
❒ 在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:
✔ @SpringBootConfiquration
✔ @EnableAutoConfiquration
✔ @ComponentScan

❒ 自动配置过程
1. SpringBoot启动的时候加载主配置类,主配置类开启了自动配置功能,@EnableAutoConfiguration。
2. 利用AutoConfigurationImportSelector.class给容器中导入N多的组件
   2.1. 通过AutoConfigurationImportSelector.class里的selectImports方法中的getCandidateConfigurations,获取候选的配置。
   2.2. 将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值放到容器中。
   2.3. 这样的每一个xxxAutoConfiguration类都是一个自动配置类,这样的每一个类对应一个XXXProperties配置节点类,专门控制XXX可以有哪些节点配置以及默认的配置值。
   2.4. xxxAutoConfiguration配置类只有满足一定的条件(比如@ConditionalOnClass)整个配置类才能生效,也才能放到容器中。

❒ Conditional派生注解(Spring注解版原生的@Conditional作用)
  @Conditional扩展注解作用(判断是否满足当前指定条件)
  @ConditionalOnJava 系统的java版本是否符合要求
  @ConditionalOnBean 容器中存在指定Bean
  @ConditionalOnMissingBean 容器中不存在指定Bean
  @ConditionalOnExpression 满足SpEL表达式指定
  @ConditionalOnClass 系统中有指定的类
  @ConditionalOnMissingClass 系统中没有指定的类
  @ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
  @ConditionalOnProperty 系统中指定的属性是否有指定的值
  @ConditionalOnResource 类路径下是否存在指定资源文件
  @ConditionalOnWebApplication 当前是web环境
  @ConditionalOnNotWebApplication 当前不是web环境
  @ConditionalOnJndi JNDI存在指定项

❒ 自己写一个自动配置的工具包
✔ 第一步
@Configuration
@ConditionalOnProperty(name = "my.service.enabled", havingValue = "true", matchIfMissing = true)
public class MyServiceAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyService();
    }
}

✔ 第二步
在resources/META-INF/spring.factories文件中注册自动配置类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyServiceAutoConfiguration

✔ 第三步
在开发项目中直接使用Bean对象MyService即可。
🏳️‍🌈 问题总结
✔ @EnableAutoConfiquration
✔ 该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories
✔ @ConditionalOnClass
📖 问题信息
📈 浏览次数:35 | 📅 更新时间:2025-12-04 01:48:19
📦 创建信息
🏷️ ID:49 | 📅 创建时间:2024-10-15 10:25:06