springBoot的优势之一是:自动装配。
springBoot的自动配置,大体解释一下,当使用了特定注解后,springboot底层会帮我们进行配置,简化了简化手动配置的内容。
@SpringBootApplication
每一个springboot项目都会有一个启动类,在这个启动类里带有@SpringBootApplication注解,说明这是一个Spring Boot应用,它是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan的组合。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
// ......
}
- @ComponentScan 自动扫描
作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中 - @SpringBootConfiguration 配置类
它用来表示这是一个springboot的配置类,在这个注解的底层有一个@Configuration的注解
- @EnableAutoConfiguration开启自动配置功能
以前需要手动配置的,SpringBoot可以自动配置 ;只需要添加@EnableAutoConfiguration注解开启自动配置功能即可。
在这个注解底层还有两个注解:
- @AutoConfigurationPackage
主要作用就是将主启动类所在的包下面所有的组件都扫描到spring容器中。 - @Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector :自动配置导入选择器,给容器中导入一些组件
AutoConfigurationImportSelector.class
↓
selectImports方法
↓
this.getAutoConfigurationEntry(annotationMetadata)方法
↓
this.getCandidateConfigurations(annotationMetadata, attributes)方法
↓
方法体:
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
↓
在所有包名叫做autoConfiguration的包下面都有META-INF/spring.factories文件
@Conditional
在spring.factories文件中包含了springboot所支持的可自动配置的的装备类,但是自动配置时,这些类不会全部加载,@Conditional注解可以帮助springboot按需装配。
自定义用法
自定义类实现Condition接口,重写 matches 方法,在 matches 方法中进行逻辑判断,返回boolean值。
matches 方法两个参数:
1. context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。
2.metadata:元数据对象,用于获取注解属性。
SpringBoot 提供的常用条件注解
在springBoot-autoconfigure的condition包下有很多条件注解
- @Conditional(条件类.class)注解
- ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
- ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
- ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean
- ConditionalOnBean:判断环境中有对应Bean才初始化Bean
总结
借用一下优秀作者的图示来总结一下吧