SpringBoot自动装配原理
2023-01-12 09:08:20 0 举报
一图看懂Springboot自动装配原理
作者其他创作
大纲/内容
checkExcludedClasses()进行排除的自动配置类Check,存于exclusions中,configurations.removeAll(exclusions);进行删除
主要关注的4个jar包(因为就这三个Jar中有autoconfiguration类)2.7.7之前版本是只读上面三个,devtool这个jar是没有的此部分是在SpringBoot初期化的时候进行加载,然后存于Cache中,
读取
getSpringFactoriesLoaderFactoryClass
factoryTypeName =factoryType.getName())获取
@SpringBootApplication注解类上的注解@Target(ElementType.TYPE) 标记该注解可以标注在哪里@Retention(RetentionPolicy.RUNTIME) 用该注解标注的类以怎么样的方式保留 例如:RetentionPolicy.RUNTIME :在运行时会被JVM加载@Documented 在javaDoc中会生成注解的信息@Inherited 表示是否会被继承@SpringBootConfiguration : SpringBoot的配置类标记,就是在类上有这个注解,说明他就是Spring Boot的配置类 继承了@Configuration配置类注解font color=\"#323232\
@AutoConfigurationgPackage将当前配置类所在包保存到一个叫BasePackage的Bean中,供Spring内部使用
@SpringBootApplication(SpringBoot入口)Springboot应用标注该注解说明这个类是Spring Boot的主配置类,SpringBoot需要运行这个类的main方法来启动SpringBoot
@EnableAutoConfiguration(开启自动配置)开启自动配置,并扫描所有的自动配置类,并进行过滤(AutoConfigurationExcludeFilter.class)出自己需要的自动配置类
AutoConfigurationImportSelector 中的selectorImports方法
@Import(AutoConfigurationPackages.Registrar.class) // 保存扫描路径, 提供给spring‐data‐jpa 需要扫描 @Entitypublic @interface AutoConfigurationPackage {
getExclusions()获取排除加载的条件(@ComponentScan)注解设置的
有没有实现getImportGroup()
没有
以这个类全名称进行过滤要加载的自动配置类
loadSpringFactories去读取一个用来存储配置类的文件
AutoConfigurationImportSelector.getCandidateConfigurations获取所有的配置类,127个
过滤后还有27个(pom中之追加了最近本的),2.7.7版本之前是23个
AutoConfigurationImportSelector.getAutoConfigurationEntry()继承了变种的ImportSelector,获取所有有效的自动配置类
返回EnableAutoConfiguration.class
.......
1
@Import(AutoConfigurationImportSelector.class)(最主要的关键点)AutoConfigurationImportSelector继承了DeferredImportSelector(变种的ImportSelectorfont color=\"#323232\" style=\"\
加载后148个
DeferredImportSelector执行原理
Load之后发现并没有想要的EnableAutoConfiguration关联的信息,在2.7.7版本之前是在这里Load,2.7.7版本这里就没有load了,因为2.7.7之后AutoConfiguration自动配置类不配置到META-INF\\spring.factories中了,改为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports※此处加载的是监听,过滤等条件
@AutoConfigurationgPackage注解类中导入了Registar.class
有
SpringBootApplication注解说明
SpringBoot自动装配原理
getOrDefault方法用(org.springframework.boot.autoconfigure.EnableAutoConfiguration)作为Key进行过滤
this.getConfigurationClassFilter().filter(configurations)根据pom添加的start进行过滤,过滤出来最后的有效配置类
SpringFactoriesLoader.loadFactoryNames
返回继承Group的AutoConfigurationGroup.class类
AutoConfigurationGroup.process方法
classLoader.getResources(\"META-INF/spring.factories\") : ClassLoader.getSystemResources(\"META-INF/spring.factories\")
存储配置类文件
首先AutoConfigurationImportSelector 继承了DeferredImportSelector并重写了DeferredImportSelector中的getImportGroup方法
执行selectorImports方法,返回一个字符串数组,并将数组中定义的完整类名注册成Bean到Spring的IOC容器中
AutoConfigurationGroup.selectImports方法
这就是要加载的自动配置类127个,用来帮助我们整理第三方库的一些默认设置spring-boot-autoconfigure\\META-INF\\spring.factories在2.7.7版本中已经增加到了148个了并且文件和路径发生了变化,改到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports自动配置类中
2.7.7版本后追加了新的自动配置类配置文件之后,就只读取这两个jar了,因为只有这两个jar下面有自动配置类路径
2
没有结果为空,并没有拿到想要的配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration
去加载所有的jar包中和类路径中的这个配置类文件,去读取
readCandidateConfigurations(url)
自动配置类文件路径:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
收藏
0 条评论
回复 删除
下一页