SpringBoot是我们经常使用的框架,那么你能不能针对SpringBoot实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实现自动配置的流程图。牵扯到哪些关键类,以及哪些关键点。

下面我们一起来看看吧!!

前言:

阅读完本文:

  1. 你能知道 SpringBoot 启动时的自动配置的原理知识
  2. 你能知道 SpringBoot 启动时的自动配置的流程
  3. 以及对于 SpringBoot 一些常用注解的了解

一步一步 debug 从浅到深。

注意本文的 SpringBoot 版本为 2.5.2

一、启动类

前言什么的,就不说了,大家都会用的,我们直接从 SpringBoot 启动类说起。

@SpringBootApplication
public class Hello {public static void main(String[] args) {SpringApplication.run(Hello.class);}
}

@SpringBootApplication 标注在某个类上说明这个类是 SpringBoot 的主配置类, SpringBoot 就应该运行这个类的main方法来启动 SpringBoot 应用;是我们研究的重点!!!它的本质是一个组合注解,我们点进去,看看javadoc上是怎么写的,分析从浅到深,从粗略到详细。

我们点进去看:

@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}

Javadoc上是这么写的

表示声明一个或多个@Bean方法并触发 auto-configuration 和 component scanning 的 configuration 类。 这是一个方便的注解,相当于声明了 @Configuration 、 @EnableAutoConfiguration 和@ComponentScan 。

—为什么它能集成这么多的注解的功能呢?

是在于它上面的 @Inherited 注解, @Inherited 表示自动继承注解类型。

这里的最重要的两个注解是 @SpringBootConfiguration@EnableAutoConfiguration

1.1、@SpringBootConfiguration

我们先点进去看看 @SpringBootConfiguration注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {}。

1.2、@EnableAutoConfiguration

再看看 @EnableAutoConfiguration.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

1.3、@ComponentScan

@ComponentScan:配置用于 Configuration 类的组件扫描指令。 提供与 Spring XML<context:component-scan> 元素并行的支持。
可以 basePackageClassesbasePackages( 或其别名value )来定义要扫描的特定包。 如果没有定义特定的包,将从声明该注解的类的包开始扫描。

作为了解,不是本文重点。

1.4、探究方向

主要探究图中位于中间部分那条主线,其他只会稍做讲解。

二、@SpringBootConfiguration

我们刚刚已经简单看了一下 @SpringBootConfiguration 啦。

@Configuration
@Indexed
public @interface SpringBootConfiguration {}

它是 springboot 的配置类,标注在某个类上,表示这是一个 springboot的配置类。

我们在这看到 @Configuration ,这个注解我们在 Spring 中就已经看到过了,它的意思就是将一个类标注为 Spring 的配置类,相当于之前 Spring 中的 xml 文件,可以向容器中注入组件。

不是探究重点。

三、@EnableAutoConfiguration

我们来看看这玩意,它的字面意思就是:自动导入配置。

@Inherited
@AutoConfigurationPackage  自动导包
@Import(AutoConfigurationImportSelector.class) 自动配置导入选择
public @interface EnableAutoConfiguration {}

从这里顾名思义就能猜到这里肯定是跟自动配置有关系的。

我们接着来看看这上面的两个注解 @AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class) ,这两个才是我们研究的重点。

3.1、@AutoConfigurationPackage

点进去一看:

@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}

@Importspring 的注解,导入一个配置文件,在 springboot 中为给容器导入一个组件,而导入的组件由 AutoConfigurationPackages.Registrar.class 执行逻辑来决定的。

往下

今天,我们来详细的聊一聊SpringBoot自动配置原理,学了这么久,你学废了吗?相关推荐

  1. SpringBoot 自动配置原理(超级无敌详细)-2

    SpringBoot 自动配置原理(超级无敌详细)-1 2.自动配置的实现 刚刚我们整体的过了一下主配置文件是如何实现的,但我们还没深入的研究如何实现自动装配功能.我们回到这个文件下,找一个具体的自动 ...

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

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:你在我家门口 juejin.im/post/5ce5effb ...

  3. SpringBoot | 自动配置原理

    微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 这个月过去两天了,这篇文章才跟大家见面,最近比较累,大家见谅下.下班后闲着无聊看了下 SpringBoot 中的自动配置,把我 ...

  4. 【详解】面试必问:SpringBoot自动配置原理

    前言 SpringBoot框架是开发中的一大利器,其简化了spring的xml的配置,遵循了"约定大于配置"的原则,使用注解对常用的配置做默认配置,减少使用xml配置模式.Spri ...

  5. 聊一聊 SpringBoot 自动配置的原理

    解析思路 我们建立好一个SpringBoot的工程后,我们将从启动类,SpringBootApplication开始进行探究. 开始解析 首先我们建立一个 Springboot的工程.找到启动类,我们 ...

  6. SpringBoot 自动配置原理

    创建项目 通过Spring Initialize创建SpringBoot项目 而接下来要说的是关于配置文件的事情.关乎配置文件可以参考官方文档. 对于配置文件来说到底在配置文件里面可以进行配置那些内容 ...

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

    www.cnblogs.com/leihuazhe/p- SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConf ...

  8. springboot自动配置的原理_SpringBoot实战:详解SpringBoot自动配置原理

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

  9. SpringBoot :SpringBoot自动配置原理

    1.美图 2.概述 SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties ...

最新文章

  1. 代码注释//_您应该停止编写//的五个代码注释,并且//应该开始的一个注释
  2. 1132 Cut Integer
  3. 互联网架构,究竟为啥要做服务化?
  4. 中国计算机学会YOCSEF TDS《专题探索班》,新一代人工智能的基础与前瞻
  5. 导入安全证书到jdk
  6. 常用命令集合_Windows
  7. 运行Jenkins部署任务
  8. 【MySQL】mysql查看库 表占用存储空间大小
  9. Kaggle 数据清洗挑战 Day 5 - 处理不一致数据
  10. 升级dedecms5.5后,出现提示保存目录数据时失败,请检查你的输入资料是否存在问题...
  11. oracle性能优化 pdf,Oracle性能优化技术内幕 pdg-pdf
  12. IDEA和Webstorm主题配色
  13. wdr7660虚拟服务器设置,TP-LINK WDR7660用手机怎么设置?
  14. SQL——语法基础篇(上)
  15. Maven 错误找不到符号
  16. Win10下运行复活之秦殇前传
  17. JavaScript流程控制-循环(循环(for 循环,双重 for 循环,while 循环,do while 循环,continue break))
  18. ACM-ICPC 2018 沈阳赛区网络预赛(E F G J K)
  19. Python程序来计算球体的体积和面积
  20. 几种开源虚拟产品的介绍及性能比较

热门文章

  1. 多个硬件体验如一,华为终端分布式技术会重构IoT生态吗?
  2. solr6 java_Solr6 快速入门教程
  3. c语言反编译_Gacrux:基于C语言的可自定义PE加载恶意软件
  4. CTF(Pwn) 当题目为我们提供Libc版本.so文件, 与 不提供的区别
  5. Buuctf(PWN)ciscn_2019_c_1
  6. Linux环境下安装Python第三方库
  7. Python零基础教程:函数和类内建魔法属性
  8. python中的逻辑关系
  9. python之super
  10. python numpy np.convolve()函数(返回两个一维序列的离散线性卷积)