springboot自学(4)自动配置原理

自动配置原理

1、收集spring开发者的编程习惯,整理开发过程使用的常用技术列表——》技术集A

2、收集常用技术(技术集A)的使用参数,整理开发过程中每个技术的常用设置列表——》设置集B

3、初始化springboot基础环境,加载用户自定义的bean和导入的其他坐标,形成初始化环境

4、将技术集A包含的所有技术都定义出来,在spring或springboot启动时默认全部加载

5、将技术集A中具有使用条件的技术约定出来,设置成按条件加载,由开发者决定是否使用该技术(与初始化环境比对)

6、将设置集B作为默认配置加载(约定大于配置),减少开发者配置工作量

7、开放设置集B的配置覆盖接口,有开发者根据自身需要决定是否覆盖默认配置

 

源码:

 

 

先从第一个说起,Registrar是实现了ImportBeanDefinitionRegistrar接口,通过BeanDefinition的注册器注册实名bean,实现对容器中的bean的裁定

 

 

registerBeanDefinitions方法里面,又调用了一个register方法,第一个参数是注册器,而第二个参数是获取了当前的包

 

 

进入这个register方法后,会先判断这个注册器是否包含一个BEAN的bean定义

 

 

加载过是一回事,没加载过是另一回事,目前没加载过,所以走else,注册BeanDefinition,bean的类名就是BEAN,进入第二个参数,第一个方法描述的是一个包的信息,第二个是设置权限,关键是第三个,把传过来的参数加到BasePackages对象里面去,就是记录了你要扫哪些包(只是添加进去,而不是设置,因为其他的注解也是有很多的包参加扫描的)

 

 

那么这个注解的功能我们就了解了

 

 

第二个注解

里面的接口分三个大类,其中几个是Aware结尾的,实现这些接口的目的就是为了获取Aware前面资源的对象

 

 

当然是实现接口里的方法给这些变量赋值才行,如

 

 

Ordered的含义是当前这个类在spring容器中的加载顺序

 

 

而这个注解的加载顺序是最大值-1

最后DeferredImportSelector,里面继承了ImportSelector,

 

 

 

里面定义了一个全新的接口Group,先从process开始看起

 

 

看看怎么实现的

 

 

接下来看红线的方法

 

 

 

不断的往里面深度会到这一步,就是自动装配读取spring.fatories的代码了

 

 

 

以上是对技术集A的加载部分。接下来是对设置集的加载。

 

 

举例找redis的加载,根据这个值找到对应的类

 

 

看注释有条件加载,必须有RedisOperations才能加载。但是目前没有

 

 

加上redis的依赖以后,才有了

 

 

接下来是加载redis的配置类,并设定为bean

 

再进去就是加载redis的配置文件,就是springboot的配置文件

 

不配置的话,里面都是有默认值的,但是有的也没有,比如username

 

接下来的@Import导入的是两种客户端的实现

 

最关键的是,定义bean,第一个是如果当前环境下没有redisTemplate这个bean且没有提供redis的连接工厂,就加载下面的代码生成一个redisTemplate,这样能够防止重复加载,因为也有自己定义redisTemplate的可能。

 

而下面的是stringRedisTemplate

 

自己开发自动配置

Springboot不是包含了所有的技术,比如MyBatis

 

参考MyBatis,自己写的话也是一样弄个spring.factories,把自己的自动配置类写进去就行了

那么现有的不想要的怎么去掉呢

 

配置文件排除

也可以在注解springbootApplocation排除

 

 

 

 

posted @ 2024-07-30 16:02  蓝海的bug本  阅读(3)  评论(0编辑  收藏  举报