首页 > 编程语言 > 详细

关于springboot自动配置源码学习

时间:2020-08-10 21:34:28      阅读:82      评论:0      收藏:0      [点我收藏+]

  众所周知,springboot搭建项目相对于spring来说简单快速,因为springboot的原则是约定大于配置,及springboot实现了自动配置。这对于程序员来说大大简化了开发,今天就去看看它是怎么实现的。

  搭建一个简单的springboot项目,在项目目录下可以看到一个springbootApplication的启动类,一切的一切还应该从这个类说起。

  springbootApplication启动类

  技术分享图片

 

 

     application类中,标有一个@SpringbootApplication注解,该注解是一个复合注解,主要有@EnableAutoConfiguration和@ComponentScan

               技术分享图片

 

    实现自动配置,关键就在于@EnableAutoConfiguration,进入@EnableAutoConfiguration,可以看到@Import({AutoConfigurationImportSelector.class})注解

                技术分享图片

 

 

     进入到AutoConfigurationImportSelector.class中,我们就可以看到springboot大概是怎么实现自动配置的。

   AutoConfigurationImportSelector.class

    AutoConfigurationImportSelector.class实现了DeferredImportSelector接口并重写了selectImports()方法,首先判断环境变量spring.boot.enableautoconfiguration,如果指定为false,则不引入任何类,默认为true;如果为true则进入getAutoConfigurationEntry()方法。

技术分享图片

 

 

   getAutoConfigurationEntry()方法会做以下逻辑操作:

    1. 获取相应类上@EnableAutoConfiguration对应的属性,其实也就是exclude属性和excludeName属性

    2. 读取classpath环境下所有的META-INF\spring.factories文件中的org.springframework.boot.autoconfigure.EnableAutoConfiguration属性,得到configurations集合

    3. 根据第三步读取的配置以及spring.autoconfigure.exclude环境变量指定的配置,得到exclusions集合

    4. 确保exclusions集合是configurations集合的子集,以及exclusions集合内的class均是存在于classpath环境的。否则异常会抛出

    5. 根据上述的exclusions集合筛选出未被过滤的configurations集合。

    6. 根据第7点筛选出来的configurations集合,再在autoConfigurationMetadata的基础上针对ConditionalOnClass属性筛选一轮
      比如:org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration.ConditionalOnClass=org.springframework.cache.CacheManager
      表示如果要应用CacheAutoConfiguration,则得保证org.springframework.cache.CacheManager类存在

    7. 触发AutoConfigurationImportEvent事件

    8. 返回筛选过后的configurations集合

技术分享图片

 

 

   在第2步中,getCandidateConfigurations(annotationMetadata, attributes)方法中有调用了SpringFactoriesLoader.loadFactoryNames()方法

 

技术分享图片

 

 

 技术分享图片

 

关于springboot自动配置源码学习

原文:https://www.cnblogs.com/lyzj/p/13470407.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!