springboot自动装配底层实现原理
2022/3/7 6:15:15
本文主要是介绍springboot自动装配底层实现原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
SpringBoot自动装配原理
1.@SpringBootApplication
@SpringBootApplication //主启动类的注解 public class ShiroSpringbootApplication { public static void main(String[] args) { SpringApplication.run(ShiroSpringbootApplication.class, args); } }
2.核心三大注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
点进去之后会发现,作为SpringBoot配置的三个核心注解
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
1、@SpringBootConfiguration
追进去是咋们的@Configuration注解, 代表当前是一个核心配置类
2、@ComponentScan
这是指定我们要扫描哪些,Spring注解
3、@EnableAutoConfiguration
点进去之后会发现除了其他基本注解外,主要核心就是以下两个
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class})
(1)@AutoConfigurationPackage
自动配置包,点进去之后会发现@Import这个组件
@Import({Registrar.class}) 相当于给容器中导入一个这个组件
当我我追踪这个Registrar.class会发现这个类重写了两个方法
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()); } public Set<Object> 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<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
this.getCandidateConfigurations(annotationMetadata, attributes);这个方法会进入到我们
对于里面的一些配置会通过我们spring工厂的加载器,进行一个加载操作
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
.loadFactoryNames(),点进去会有 SpringFactoriesLoader.class.getClassLoader();
SpringFactoriesLoader这个方法里面
最终通过这个方法加载得到一个Map<String,List
而在此之后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这样的方式替换底层的主键
- 用户可以根据组件绑定的配置文件,通过调用改属性去进行修改
这篇关于springboot自动装配底层实现原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南