determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));
}
Registrar.class里面的registry方法:
Registrar作用:把某一个包下的组件注册进去
? 通过registry给容器中导入一系列组件
AnnotationMetadata相当于我们注解的元信息,而这个注解指的是AutoConfigurationPackage,由于这个注解@EnableAutoConfiguration里的组成注解,也是@SpringBootApplication下的元注解,所以说这个注解是针对于主启动类下我们的MainApplication所以说,我们的metadata元信息标在这个类下
new AutoConfigurationPackages.PackageImport(metadata)).getPackageName(),通过通过包导入的方法,获取到元数据对应的包名,而这个包名正好对应我们项目的包名,然后讲我们包下的组件封装到我们的register里面去,通过register()这个方法批量注册进去。
换句话说就是register()这个方法把某一个包的组件注册到容器中,而这个包就是我们Main主启动类对应的包
(2)@Import({AutoConfigurationImportSelector.class})
? 这个注解相当于给容器中导入一些组件
? 点进去后,会发现这个方法
.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
获取所有所有配置的集合
我们通过debug发现,候选配置有很多个
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
this.getCandidateConfigurations(annotationMetadata, attributes);这个方法会进入到我们
对于里面的一些配置会通过我们spring工厂的加载器,进行一个加载操作
List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
.loadFactoryNames(),点进去会有 SpringFactoriesLoader.class.getClassLoader();
SpringFactoriesLoader这个方法里面
最终通过这个方法加载得到一个Map>这样的一个集合,即得到了我们所有的组件,
而在此之后classLoader.getResources()方法会获取我们的资源文件
有个META-INF/spring.factories
路径
这个方法会默认扫描在我们当前系统所有META-INF/spring.factories位置的文件
而最核心的就是这个spring-boot-autoconfigure-2.6.3.jar这个包
我们打开当前的spring.factories,可以看到我们springboot全场景的自动配置都导进来了
可以说文件写死了spring-boot-启动就要给容器中加载所有配置;
虽然我们127个场景的所有自动配置在启动时候默认是是全部加载,但是它会通过按需开启自动导入配置项
即我们每个场景中的以后缀名为AutoConfiguration配置文件中的@Conditional(条件装配注解),以这个为参照,最终会按需装配
若我们有使用其中的个别场景
我们进入这个场景的AutoConfiguration配置文件,若想更改配置,我们可以通过在yml中,并!!根据该配置文件绑定的对应Properties文件中定义的内容来修改
而这些属性或通过
利用该注解定义的前缀进行封装,我们可以通过对应的Properties文件中对应的属性进行修改
大体流程:
xxxxxxxxAutoConfiguration---> 组件 --->xxxxProperties里面的属性 --->application.properties
springboot的一个设计模式
springboot会在底层配好所有的组件,但是如果用户自己配置了以用户的优先,从@ConditionOnMissBean这个注解可以看出
在这个方法下的内容就就是,去除一些不要的,排斥的,或者重复的配置,最后返回configurations
@EnableAutoConfiguration总结
SpringBoot先加载所有的自动配置类 xxxxAutoConfiguration
每个自动配置类按条件生效,默认都会绑定配置文件指定的值。即xxxxProperties里面拿,xxxProperties配置文件进行了绑定。
生效的配置类就会给容器中装配很多组件
只要容器中有这些组件,相当于这些功能就有了
定制化配置
用户可以通过@Bean这样的方式替换底层的主键
用户可以根据组件绑定的配置文件,通过调用改属性去进行修改