我们都知道SpringBoot帮助我们集成了许多组件和配置,那么SpringBoot是如何集成这些配置并在启动是自动进行配置呢。说到这就不得又需要回过头来看一下@SpringBootApplication这个注解了,之前已经说过这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合,这里需要特殊强调下@EnableAutoConfiguration这个注解,没错就是这个注解使SpringBoot完成自动配置的。@EnableAutoConfiguration-----@Import(EnableAutoConfigurationImportSelector.class)-----AutoConfigurationImportSelector按照这个顺序我们可以进入SpringBoot的自动配置导入选择器。接下来我们就看一下SpringBoot是如何完成自动配置并观摩下源码。

   public String[] selectImports(AnnotationMetadata annotationMetadata) {    //进行选择导入
if (!isEnabled(annotationMetadata)) { //判断原数据是否为空为空返回空不为空进行导入相关操作
return NO_IMPORTS;
}
try {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata); //加载并获取属性
List<String> configurations = getCandidateConfigurations(annotationMetadata, //获取配置信息
attributes);
configurations = removeDuplicates(configurations);
configurations = sort(configurations, autoConfigurationMetadata);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
14 checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata); //从11行到16进行移除未完全集成的配置并进行排序和过滤
fireAutoConfigurationImportEvents(configurations, exclusions); //导入过滤后的组件
return configurations.toArray(new String[configurations.size()]);
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}

上面代码是进行自动配置的主方法,其实操作流程我在注释上已经进行了简单的说明

1.先对原数据进行判断是否为空再进行具体操作

2.加载原数据并获取属性

3.获取配置信息   (其实最重要的就是第三点因为如何获取配置信息并进行加载才是我们最关心的也是SpringBoot中最核心的部分)

4.移除未完全集成的配置并进行排序过滤   (由于有些配置SpringBoot并没有给我们进行完全配置,需要我们自己进行手动配置,这里之所以这么做个人认为如果SpringBoot把所有的组件都进行集成那么对项目本身启动来说就会造成一定的压力,毕竟有些组件在有些项目中并不需要使用)

5.导入处理后的组件配置

这里我们需要着重强调下getCandidateConfigurations这个方法,看看SpringBoot是如何获取组件的。

 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames( //Spring工厂进行加载获取配置信息
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct."); //如果配置不为空返回配置信息否则说明在META-INF/spring.factories这个目录下没有找到配置信息
return configurations;
}
 public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

 public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
try {
Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : //获取资源路径
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
List<String> result = new ArrayList<String>();
while (urls.hasMoreElements()) { //如果存在将资源存入结果集中
URL url = urls.nextElement();
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
String factoryClassNames = properties.getProperty(factoryClassName);
result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
}
return result;
}
catch (IOException ex) {
throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
}
}

相信看到这里已经不需要我过多的说明了,简而言之就是SpringBoot会去"META-INF/spring.factories"目录中去获取配置信息,然后再去做自动配置,现在我们在回过头来看最初SpringBoot进行自动配置的方法,我们走debug看一下。

这里我们可以看到SpringBoot在没有进行移除和过滤之前他在目录中获取到了96个组件下面再看一下过滤之后的。

过滤之后还有20个,也就是说SpringBoot为我们完全集成并自动配置的有20个组件,如果需要其他组件我们自己进行手动配置。(版本不动支持的组件数量或许有变化这里我是用的是1.5.9的版本)

除了这种方式还有其他方式来确定SpringBoot为我们自动配置了哪些组件么?如果这样看的话确实麻烦了写毕竟我们不可能每次都要在启动的时候通过debug来确认哪些是否被自动配置了,SpringBoot提供了debug启动模式让我们在控制台中就可以看到哪些进行了自动配置哪些没有完成自动配置,话不多说上图

Positive matches: 已经自动配置的 Negative matches:没有自动配置,以上就是SpringBoot如何完成自动配置的,其实自动配置这块想了好久要不要写,毕竟SpringBoot核心的配置,也怕有些地方写错了会误导其他人,也希望看到这篇文章的,看到有错误的地方希望能指正出来,互相学习互相进步,我不是一个勤快的人,但我希望能够改变当前懒散的状态,直到现在还记的我大学老师的一句话,只要开始永远不晚,只要努力就会成功,或许有鸡汤的成分,但还是希望只要开始永远不晚。

在很长的一段时间我变的颓废混日子,甚至忘了当初选择这个行业的初衷,总是喜欢抱怨种种得不公,我希望以后的日子我能找回那个努力的自己,没有人愿意平平淡淡,碌碌无为过一生,不求无愧于他人,但求无愧于自己,也希望每个在这个行业里为之坚持的伙伴我们都能无愧于自己,成为那个想象中的自己。

SpringBoot(三)SpringBoot自动配置的更多相关文章

  1. Springboot学习03-SpringMVC自动配置

    Springboot学习03-SpringMVC自动配置 前言 在SpringBoot官网对于SpringMVCde 自动配置介绍 1-原文介绍如下: Spring MVC Auto-configur ...

  2. 【玩转SpringBoot】给自动配置来个整体大揭秘

    上一篇文章中提到的条件注解,只是自动配置整体解决方案中的一个环节而已,可以说是管中窥豹. 本文就逐步擦除迷雾,让整体浮现出来,这样就会有一个宏观的认识. 除了写代码之外,还能干点什么? 提到“配置”这 ...

  3. Springboot 禁用数据库自动配置

    转载至:https://blog.csdn.net/wyw815514636/article/details/80846545 https://blog.csdn.net/knqi007/articl ...

  4. SpringBoot 系列教程自动配置选择生效

    191214-SpringBoot 系列教程自动配置选择生效 写了这么久的 Spring 系列博文,发现了一个问题,之前所有的文章都是围绕的让一个东西生效:那么有没有反其道而行之的呢? 我们知道可以通 ...

  5. 【springboot】之自动配置原理

    使用springboot开发web应用是很方便,只需要引入相对应的GAV就可以使用对应的功能,springboot默认会帮我们配置好一些常用配置.那么springboot是怎么做到的呢?这篇文章将一步 ...

  6. SpringBoot 三种方式配置 Druid(包括纯配置文件配置)

    记录一下在项目中用纯 YML(application.yml 或者 application.properties)文件.Java 代码配置 Bean 和注解三种方式配置 Alibaba Druid 用 ...

  7. SpringBoot扩展SpringMVC自动配置

    SpringBoot中自动配置了 ViewResolver(视图解析器) ContentNegotiatingViewResolver(组合所有的视图解析器) 自动配置了静态资源文件夹.静态首页.fa ...

  8. IntelliJ IDEA 2017版 SpringBoot的关闭自动配置和自定义Banner

    一.关闭自动配置 在jar包下找下边的名字    设置关闭自动配置jar    多个的时候配置       二.自定义Banner   (1)网站搜索一个图案.网址:http://patorjk.co ...

  9. SpringBoot日记——SpringMvc自动配置与扩展篇

    为了让SpringBoot保持对SpringMVC的全面支持和扩展,而且还要维持SpringBoot不写xml配置的优势,我们需要添加一些简单的配置类即可实现: 通常我们使用的最多的注解是: @Bea ...

随机推荐

  1. TICA 2019 自动的自动化测试——智能化一站式的API测试服务

    阿里QA导读:新奥集团中台的陈磊为我们打开了AI测试驱动的视野,同时也深入浅出地介绍了如何打造智能化API测试框架.通过陈磊老师的分享,我们看到了AI-DT的无限可能性.以后,AI能不能代替大部分手动 ...

  2. IP不是万能药 为何有蜘蛛侠等大片的索尼要放弃电影

    ​ 为何有蜘蛛侠等大片的索尼要放弃电影"> 近年来,国内狂炒"IP"这一概念,比如动漫.网络文学.小说.游戏等,甚至围绕IP制造出内容矩阵.从一个IP延伸至多个领域 ...

  3. 图示JVM工作原理

    JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图 ...

  4. brup安装证书抓取https

    brup安装证书抓取https 0x00下载 下载安装brup 前提是需要java环境 0X01配置brup 配置brup的代理设置 0X02设置浏览器 我使用的是火狐,以下都以火狐为例 0X03证书 ...

  5. GDB调试系列之了解GDB

    想要熟练利用GDB进行程序调试,首先要了解什么是GDB. 1. 什么是GDB GDB (the GNU Project Debugger) 是一个可以运行在大多数常见的UNIX架构.Windows.M ...

  6. 小白学 Python 数据分析(11):Pandas (十)数据分组

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  7. SPA那点事

    前端猿一天不学习就没饭吃了,后端猿三天不学习仍旧有白米饭摆于桌前.IT行业的快速发展一直在推动着前端技术栈在不断地更新换代,前端的发展成了互联网时代的一个缩影.而单页面应用的发展给前端猿分了一杯羹. ...

  8. audioContext.decodeAudioData 返回null 错误

    此问题并不是100%出现.没想到国外大神已经有处理此问题的经验 原贴地址: https://stackoverflow.com/questions/10365335/decodeaudiodata-r ...

  9. 数据结构之HashMap

    前言 在我们开发中,HashMap是我们非常常用的数据结构,接下来我将进一步去了解HashMap的原理.结构. 1.HashMap的实现原理 HashMap底层是基于Hash表(也称“散列”)的数据结 ...

  10. Fabric 源码学习:如何实现批量管理远程服务器?

    前不久,我写了一篇<Fabric教程>,简单来说,它是一个用 Python 开发的轻量级的远程系统管理工具,在远程登录服务器.执行 Shell 命令.批量管理服务器.远程部署等场景中,十分 ...