springboot自动配置底层浅析

感悟:

说起spring就会想起其中的springboot
其是为了简化spring应用的初始搭建以及其的初始搭建,
其中最著名的是其摒弃了xml的开发,那么如何摒弃的,
因此就要引出我想讲述的重点:

自动配置:

意义:当springboot项目启动时,会加载配置类和属性类
其中配置类的作用是:将一些核心的组件交由工厂管理,配置类中使用了属性类进行属性注入,而属性类又会读取到配置文件中的配置,使得springboot完成自动配置的整个过程。
方便之处在于:我们每次使用springboot的时候只用写其配置文件,就可以实现我们所想要得到的功能,因为其底层已经在启动器中封装好配置类和属性类;
现在我们来说下其底层到底是如何配置的:

一 :

首先:找到入口类 ,发现@SpringBootApplication注解,这个注解是由三个注解构成
(1)@ComponentScan 包扫描 当入口类在主包下,则扫描的是主包下的所有子包
(2)@Configuration 声明当前类为配置类
(3)@EnableAutoConfiguration 开启自动配置

二 :

找到其中自动配置注解
进入其中发现上面有个注解@Import注解 其括号中的参数为
EnableAutoConfigurationImportSelector
这个注解的作用是将对象放入工厂的第四种方式,
若想使用需要实现selectImport接口 ,并实现其中的方法,selectImports
该方法的参数为AnnotationMetadata
该参数的作用为基于import操作的配置类的元信息运算并返回计算结果
其返回值类型为string字符串
这个字符串传入的值为类的全限定名
因import注解是以累的全限定名作为其的唯一标识

三:

进入上述方法发现,其并没有实现接口selectImport 而是继承了
AutoConfigurationImportSelector的类,那么想到也许该类的父类实现了接口,
因此进入其中,发现果真在其中找到了方法selectImports

四:

在该方法中有个判断,判别该方法是否启用自动配置,如不启用则直接返回空字符串,
这样也就不会有方法,或者说有功能完成了自动配置
如果该方法启用自动配置,下面便返回了一个List集合,这个集合中调用了一个方法
getCandidateConfigurations()这个方法第五步会详细解析。
该方法中是通过springFactoriesLoader找到所有的候选配置类(auto-configuration类) 然后在此基础上进行去重,排序和剔除操作,最终得到需要进行的auto-configuration类的所有类的名称,
拿到所有auto-configuration类以后springboot会加载这些类,由于这些类本身标注了configuation注解,就会被ConfigurationClassParser类进行解析,其中利用@Bean工厂方式被调用,完成bean的加载

五:

上述的getCandidateConfigurations()方法:
该方式是利用SpringFactorLoader抽象类中的方法loadFactoryNames
其中所传的参数为所有加注解的类对象,然后该方法去加载所有的
META-INF/spring.factories文件,找到所对应的类,将其解析成properties对象,在根据key(指定的class名称(启动器))来获取所有的配置项(类名称)

小结: @EnableAutoConfiguration

@ImportSelector
@SpringFactoryiesLoader
通过@EnableAutoConfiguration注解驱动引入AutoConfigurationImportSelector,
该类通过SpringFactorLoader加载所有的META-INF/spring.factories文件,获取到所有的auto-configuration候选类,然后进行去重,排序和剔除操作得到待处理的auto-configuration类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值