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排除