一、自动配置的核心

一般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. Restful 风格

    大家在做Web开发的过程中,method常用的值是get和post. 可事实上,method值还可以是put和delete等等其他值.既然method值如此丰富,那么就可以考虑使用同一个url,但是约 ...

  2. openstack核心组件--neutron网络服务(4)

    一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...

  3. 树莓派-Ubuntu Mate开启远程桌面xrdp服务

    树莓派3B+安装Ubuntu Mate后,开启远程桌面xrdp服务可以使用KRDC或mstsc远程登录访问,感觉比vnc要快一些: $ sudo apt install xrdp 安装后重启xrdp服 ...

  4. 视区相关单位vw, vh

    vw:相对于视窗的宽度,视窗宽度是100vw vh:相对于视窗的高度,视窗高度是100vh 参考资料:[https://www.zhangxinxu.com/wordpress/2012/09/new ...

  5. window 安装指定的node版本

    有时候不同的项目需要不同的node版本,window切换node版本命令很不管用,甚至需要卸载后重新装,同事分享了一下他的做法,很便利. 1.打开node官网 https://nodejs.org/e ...

  6. 《精通并发与Netty》学习笔记(03 - 客户端程序编写)

    上节我们编写了netty服务端的程序,这节我们来写客户端程序 第一步:改造服务端程序为: (1)MyServer类: package com.ssy.netty.demo01; import io.n ...

  7. layui 时间选择器 不要秒的选项

    通过修改 CSS 样式可以隐藏秒的选项 ++ .laydate-time-list{padding-bottom:0;overflow:hidden} .laydate-time-list>li ...

  8. Appendix 1- LLN and Central Limit Theorem

    1. 大数定律(LLN) 设Y1,Y2,……Yn是独立同分布(iid,independently identically distribution)的随机变量,A = SY /n = (Y1+...+ ...

  9. 第k大异或值

    这道题与2018年十二省联考中的异或粽子很相像,可以算作一个简易版: 因为这不需要可持久化: 也就是说求任意两个数异或起来的第k大值: 首先把所有数放进trie里. 然后二分答案,枚举每个数,相应地在 ...

  10. Java EE javax.servlet.http中的HttpRequest抽象类

    HttpRequest抽象类 public abstract class HttpServlet extends GenericServlet 实现的接口有:Serializable, Servlet ...