一、自动配置的核心

一般springboot程序,我们都会在主启动类上加上@SpringBootApplication注解,@SpringBootApplication是一个复合注解,上面标注了@ComponeScan,@EnableAutoConfiguration,默认开启了包扫码和自动配置。

@EnableAutoConfiguration注解上使用@Import导入了一个类,EnableAutoConfigurationImportSelector

EnableAutoConfigurationImportSelector的父类中AutoConfigurationImportSelector

有一个关键的方法selectImports(),这个方法会去找classpath下,名为spring.factories配置文件里面的需要自动配置的类列表

这里的factoryClassName就是 org.springframework.boot.autoconfigure.EnableAutoConfiguration ,后面通过classLoader加载spring-boot-autoconfigure.jar META-INF/spring.factories 文件,然后通过

factoryClassName找到对应的自动配置类

注:(spring.factories文件自动配置类列表还是很好用的,比如有些时候我们需要排除某个自动配置,而你又不知道它到底有几个配置类,可以参照这里)

有了自动配置类列表还没完,springboot需要知道列表里面那些配置是我们需要的,通过什么来判断呢?springboot最主要是通过了@Conditional家族注解,判断classpath有没有某个类,容器中有没有某个bean,application.yml文件中有没有某一条属性并且这个属性为某个值等等这些条件来判断,我是否需要装载这个配置类

下面以elasticsearch为例

springboot要装载elasticsearch配置需要满足以下条件:

  • classpath下面必须要有 org.elasticsearch.client.Client  TransportClientFactoryBean  NodeClientFactoryBean 三个class文件
  • 如果springboot上下文中没有名为 elasticsearchClient 的bean,我们如果配置了这个bean存在于上下文,那么自动配置就不会触发了

二、@Conditional

看了上面应该知道 ,@Conditional的这些注解是是否启用自动配置类的关键。下图来自《Spring Boot实战》一书:

三、总结

简单来说,Spring Boot的自动配置分为以下几个步骤:

1、@EnableAutoConfiguration注解开启自动配置,并找到spring-boot-autoconfigure.jar包里的 META-INF/spring.factories 文件

2、通过factoryClassName找到 META-INF/spring.factories 文件对应的自动配置类列表

3、springboot上下文根据自动配置类里的 @Conditional 家族注解选择是否要加载这些配置

SpringBoot-自动配置的更多相关文章

  1. SpringBoot自动配置源码调试

    之前对SpringBoot的自动配置原理进行了较为详细的介绍(https://www.cnblogs.com/stm32stm32/p/10560933.html),接下来就对自动配置进行源码调试,探 ...

  2. SpringBoot实战之SpringBoot自动配置原理

    SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @Confi ...

  3. springboot自动配置源码解析

    springboot版本:2.1.6.RELEASE SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfig ...

  4. 源码学习系列之SpringBoot自动配置(篇一)

    源码学习系列之SpringBoot自动配置源码学习(篇一) ok,本博客尝试跟一下Springboot的自动配置源码,做一下笔记记录,自动配置是Springboot的一个很关键的特性,也容易被忽略的属 ...

  5. 源码学习系列之SpringBoot自动配置(篇二)

    源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...

  6. Springboot 自动配置浅析

    Introduction 我们知道,SpringBoot之所以强大,就是因为他提供了各种默认的配置,可以让我们在集成各个组件的时候从各种各样的配置文件中解放出来. 拿一个最普通的 web 项目举例.我 ...

  7. SpringBoot自动配置原理学习

    介绍 构建Springboot项目时我们会创建一个启动类 @SpringBootApplication public class DemoApplication { public static voi ...

  8. springboot自动配置国际化失效分析

    最近在整理springBoot国际化时,发现国际化没有生效,通过报错提示在 MessageTag -> doEndTag处打断点 最后发现messageSource并不是ResourceBund ...

  9. 这样讲 SpringBoot 自动配置原理,你应该能明白了吧

    https://juejin.im/post/5ce5effb6fb9a07f0b039a14 前言 小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题 ...

  10. 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二) 上一篇分析了SpringBoo ...

随机推荐

  1. 转载:深入浅出 Java 8 Lambda 表达式

    原文地址:http://viralpatel.net/blogs/Lambda-expressions-java-tutorial/ OneAPM for Java 能够深入到所有 Java 应用内部 ...

  2. Xib设置label自动换行和Label的顶部对齐

    真的是不想说自己了,一个Xib纠结了一天,简直了,整整被虐了一上午啊...... 不知道这是Xcode8的问题呢....还是我的Xib约束什么的问题..... 只想说的是,以前也是这么设置的,明明可以 ...

  3. Springboot学习—CommandLineRunner接口(转载)

    前言 Spring boot的CommandLineRunner接口主要用于实现在应用初始化后,去执行一段代码块逻辑,这段初始化代码在整个应用生命周期内只会执行一次. 如何使用CommandLineR ...

  4. 【POJ - 3614】Sunscreen (优先队列)

    Sunscreen Descriptions C (1 ≤ C ≤ 2500) 头奶牛在海滩边晒太阳,要避免在日光浴时产生难看的灼伤,每头奶牛必须用防晒霜覆盖它的皮肤.第 i 头奶牛有一个最小和最大  ...

  5. TensorFlow-cpu优化及numpy优化

    1,TensorFlow-cpu优化 当你使用cpu版TensorFlow时(比如pip安装),你可能会遇到警告,说你cpu支持AVX/AVX2指令集,那么在以下网址下载对应版本. https://g ...

  6. 配置nginx直接使用webpack生成的gz压缩文件,而不用nginx自己压缩

    参考链接:https://blog.csdn.net/ywl570717586/article/details/100011721

  7. VMware一些概念

    物理机:真真实实存在的机器,有操作系统.内存.硬盘.网卡. 虚拟机:vmware虚拟出来的,和物理机一样有操作系统.内存.硬盘.网卡. 虚拟机的网络连接的桥接模式.NAT模式.仅主机模式简单解说:  ...

  8. Highest Frequency Letters

    Given a list of strings, output the most frequent characters that are in the same group as the lette ...

  9. 易混乱javascript知识点简要记录

    一.== vs === ==在做判断时,如果对比双方的类型不一样的话,就会进行类型转换 假如我们需要对比 x 和 y 是否相同,就会进行如下判断流程: 首先会判断两者类型是否相同.相同的话就是比大小了 ...

  10. 小白必看的Python爬虫流程

    定义: 网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本. 简介: 网络蜘蛛是一个很形象的名字.如果把互联网比喻成一个蜘蛛网,那么Spider ...