❒ 在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即可。