springboot 自动配置原理,并写一个自定义start类

 一、springboot 自动配置原理分析

在我们的启动类上,使用了一个@SpringbootApplication 的怎么一个注解,

 @SpringbootApplication 包含了三个注解,分别是

1、@SpingbootConfiguration 它的内部又使用了 @Configuration注解,标志了这个类是一个配置类

2、@ComponentScan 它的作用是根据定义的扫码路径(默认启动类所在包及他的子包下)所有符合规则的类装配到spring容器中

3、@EnableAutoConfiguration 注解,这个注解就是我们springboot 自动配置的核心注解

 进入到定义EnableAutoConfiguration注解的类里面,查看这个注解的内容,EnableAutoConfiguration里面又使用了 @Import注解,Import注解引入了一个叫AutoconfigurationImportSelector这个类,这个类实际间接实现了importSelector接口,并重写了selectImports方法

 

 这是AutoConfigurationImportSelector的 selectImports方法,他返回了一个字符串数组,实际上就是需要自动配置的类的全限定名的数组

总结来说就是 @EnableAutoConfiguration 注解引入了@Import注解,@Import注解的作用是指定一个实现了ImportSelector接口的类,并重写selectImports方法,返回我们需要加载到springboot容器中的类全限定名的一个数组。

接下来我们继续看 AutoConfigurationImportSelector 的 selectImports方法,他调用了getAutoConfigurationEntry这个方法,点击进入这个方法查看相关内容,主要的实现逻辑就是在这里

1、它首先调用了 getCandidateConfigurations,这个方法就是返回一个List<String> ,实际上就是所有jar包下,2.7.2以前是放在 META-INF/spring.factories 这个文件下 以 EnableAutoConfiguration为key的一些value值(都是一些配置类的全限定名),2.7.2以后是扫描 META-INF/spring/org.springframework.boot.autoconfigure.imports 这个文件下

 点击就进去查看 getCandidateConfigurations方法,我目前使用的版本是2.3.2.RELEASE

,可以看到,这个方法里面调用 loadFactoryNames方法,这个方法的作用就是扫描META-INF/spring.factories这个文件的配置类

2、执行完getCandidateConfigurations 获取到一个配置类的全限定名集合后调用removeDupicates方法,对集合去重

3、执行getCxclusions获取需要排除的的配置类(EnableAutoConfiguration注解下有两个属性exclude 与 excludeName,通过配置这两个属性配置需要排除自动装配的类),使用集合的removeAll删除需要排除的自动配置的类

4、执行filter方法,对自动配置的类做一些过滤(自动配置的类,一般都是有条件配置,conditionOnClass等注解,符合条件的才生效),过滤一些不生效的配置,然后剩下的就是springboot 需要自动配置的类了,这就是一个springboot 自动装配的原理,

二、写一个自定义start

创建一个maven项目,命名为 chenzm-spring-boot-starter

 引入相关依赖

写两个自动装配的测试类

创建一个自动配置扫描的文件 META-INF/spring.factories

并把需要自动配置的类 org.chenzm.AutoConfigTest添加到文件中

 maven  install 生成jar包到本地的maven 仓库中

 然后创建测试项目,引入刚刚打包好的starter

创建一个测试控制类,把我们自动配置的类里面创建的bean注入进来 

调用接口进行测试,成功返回信息,说明我们的自动配置类已经生效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值