今天,我们来详细的聊一聊SpringBoot自动配置原理,学了这么久,你学废了吗?
SpringBoot
是我们经常使用的框架,那么你能不能针对SpringBoot
实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实现自动配置的流程图。牵扯到哪些关键类,以及哪些关键点。下面我们一起来看看吧!!
前言:
阅读完本文:
- 你能知道 SpringBoot 启动时的自动配置的原理知识
- 你能知道 SpringBoot 启动时的自动配置的流程
- 以及对于 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>
元素并行的支持。
可以 basePackageClasses
或basePackages
( 或其别名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 {}
@Import
为 spring
的注解,导入一个配置文件,在 springboot
中为给容器导入一个组件,而导入的组件由 AutoConfigurationPackages.Registrar.class
执行逻辑来决定的。
往下
今天,我们来详细的聊一聊SpringBoot自动配置原理,学了这么久,你学废了吗?相关推荐
- SpringBoot 自动配置原理(超级无敌详细)-2
SpringBoot 自动配置原理(超级无敌详细)-1 2.自动配置的实现 刚刚我们整体的过了一下主配置文件是如何实现的,但我们还没深入的研究如何实现自动装配功能.我们回到这个文件下,找一个具体的自动 ...
- 这样讲 SpringBoot 自动配置原理,你应该能明白了吧
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:你在我家门口 juejin.im/post/5ce5effb ...
- SpringBoot | 自动配置原理
微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 这个月过去两天了,这篇文章才跟大家见面,最近比较累,大家见谅下.下班后闲着无聊看了下 SpringBoot 中的自动配置,把我 ...
- 【详解】面试必问:SpringBoot自动配置原理
前言 SpringBoot框架是开发中的一大利器,其简化了spring的xml的配置,遵循了"约定大于配置"的原则,使用注解对常用的配置做默认配置,减少使用xml配置模式.Spri ...
- 聊一聊 SpringBoot 自动配置的原理
解析思路 我们建立好一个SpringBoot的工程后,我们将从启动类,SpringBootApplication开始进行探究. 开始解析 首先我们建立一个 Springboot的工程.找到启动类,我们 ...
- SpringBoot 自动配置原理
创建项目 通过Spring Initialize创建SpringBoot项目 而接下来要说的是关于配置文件的事情.关乎配置文件可以参考官方文档. 对于配置文件来说到底在配置文件里面可以进行配置那些内容 ...
- SpringBoot实战之SpringBoot自动配置原理
www.cnblogs.com/leihuazhe/p- SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConf ...
- springboot自动配置的原理_SpringBoot实战:详解SpringBoot自动配置原理
SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @Confi ...
- SpringBoot :SpringBoot自动配置原理
1.美图 2.概述 SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties ...
最新文章
- 代码注释//_您应该停止编写//的五个代码注释,并且//应该开始的一个注释
- 1132 Cut Integer
- 互联网架构,究竟为啥要做服务化?
- 中国计算机学会YOCSEF TDS《专题探索班》,新一代人工智能的基础与前瞻
- 导入安全证书到jdk
- 常用命令集合_Windows
- 运行Jenkins部署任务
- 【MySQL】mysql查看库 表占用存储空间大小
- Kaggle 数据清洗挑战 Day 5 - 处理不一致数据
- 升级dedecms5.5后,出现提示保存目录数据时失败,请检查你的输入资料是否存在问题...
- oracle性能优化 pdf,Oracle性能优化技术内幕 pdg-pdf
- IDEA和Webstorm主题配色
- wdr7660虚拟服务器设置,TP-LINK WDR7660用手机怎么设置?
- SQL——语法基础篇(上)
- Maven 错误找不到符号
- Win10下运行复活之秦殇前传
- JavaScript流程控制-循环(循环(for 循环,双重 for 循环,while 循环,do while 循环,continue break))
- ACM-ICPC 2018 沈阳赛区网络预赛(E F G J K)
- Python程序来计算球体的体积和面积
- 几种开源虚拟产品的介绍及性能比较
热门文章
- 多个硬件体验如一,华为终端分布式技术会重构IoT生态吗?
- solr6 java_Solr6 快速入门教程
- c语言反编译_Gacrux:基于C语言的可自定义PE加载恶意软件
- CTF(Pwn) 当题目为我们提供Libc版本.so文件, 与 不提供的区别
- Buuctf(PWN)ciscn_2019_c_1
- Linux环境下安装Python第三方库
- Python零基础教程:函数和类内建魔法属性
- python中的逻辑关系
- python之super
- python numpy np.convolve()函数(返回两个一维序列的离散线性卷积)