Spring Boot的配置和自动配置原理
@SpringBootApplication:
spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot
需要运行这个类的main方法来启动SpringBoot应用
- SpringBootApplication
@Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Inherited
5 @SpringBootConfiguration
6 @EnableAutoConfiguration
7 @ComponentScan(excludeFilters = {
8 @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
9 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
10 public @interface SpringBootApplication {
- @Target(ElementType.TYPE) : 设置当前注解可以标记在哪
- @Retention(RetentionPolicy.RUNTIME) : 当注解标注的类编译以什么方式保留 RetentionPolicy.RUNTIME 会被jvm加载
- @Documented: java doc 会生成注解信息
- @Inherited: 是否会被继承
- @SpringBootConfiguration : Spring Boot的配置类; 标注在某个类上,表示这是一个Spring Boot的配置类;
- @Configuration : 配置类上来标注这个注解; 配置类 ----- 配置文件;配置类也是容器中的一个组件;
- @ComponentScan : 扫描包 相当于在spring.xml 配置中context:component-scan 但是并没有指定basepackage,如果没有指定spring底层会自动扫描当前配置类所在的包
- @EnableAutoConfiguration:开启自动配置功能; 以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置,会帮我们自动去加载 自动配置类
- @ComponentScan : 扫描包 相当于在spring.xml 配置中context:component-scan 但是并没有指定basepackage,如果没有指定spring底层 会自动扫描当前配置类所在的包
10.@ TypeExcludeFilter:springboot对外提供的扩展类, 可以供我们去按照我们的方式进行排除 - @ AutoConfigurationExcludeFilter:
排除所有配置类并且是自动配置类中里面的其中一个 动配置功能;这样自动配置才能生效;.
这个注解里面,最主要的就是@EnableAutoConfiguration,这么直白的名字,一看就知道它要开启自动配置,于是默默进去@EnableAutoConfiguration的源码。
@Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Inherited
5 @AutoConfigurationPackage
6 @Import(AutoConfigurationImportSelector.class)
7 public @interface EnableAutoConfiguration {
通过注解@import导入了一个autoconfigurationImportSelector,而它实现了变种的DeferredImportSelector接口,通过里面的getImportGruop()方法返回的AutoConfigurationGroup.class
返回的类
判断是否实现了DeferredImportSelector.Group这个接口,实现了则调用关键方法,process()方法,里面调用了getAutoConfigurationEntry()方法
获取了所有有效的配置类,在getAutoConfigurationEntry()方法里调用了getCandidateConfiguation()方法
获取了所有配置类,getCandidateConfiguation()方法通过ImportCandidates.load读取jar包里面的META-INF/spring.factories读取到所有的配置类,然后通过this.getConfigurationClassFilter().filter()根据我们pom依赖中添加start过滤出有效配置类
流程图:
判断是否实现了DeferredImportSelector.Group这个接口,实现了则调用关键方法,process()方法
获取所有配置
读取jar包里面的META-INF/spring.factories读取到所有的配置类
根据我们pom依赖中添加start过滤出有效配置类,自此完成我们的自动装配