聊一聊 SpringBoot 自动配置的原理
解析思路
我们建立好一个SpringBoot的工程后,我们将从启动类,SpringBootApplication开始进行探究。
开始解析
首先我们建立一个 Springboot的工程。找到启动类,我们看到启动类上有一个注解@SpringBootApplication。我们从这开始。

我们通过idea点进去看看

这是两个关键的注解,我们先来看一下@SpringBootConfiguration里面是个啥。

发现就是个普通的@Configuration注解,至此,破案。
我们要重点来看@EnableAutoConfiguration注解。这个注解可以说是SpringBoot实现自动配置的关键。
点进去看一下,发现他引入了这么一个class类,顺嘴提一下,这个import注解关键啊。他这个注解就是类似,我们将多个xml文件写入到一个xml文件中的情况。所以我们得看看他这个都导入了什么。继续点击,AutoConfigurationImportSelector进去看看

来到AutoConfigurationImportSelector类中。
我们首先来看他重写的方法selectImports。

两个方法,loadMetadata和getAutoConfigurationEntry
我们先看loadMetadata,loadMetadata 打了个断点看了一下,大致就是说去找spring-autoconfigure-meatadata.properties。
将这个配置文件搞成一个配置文件类,返回。这个配置文件中存在的东西就是自动配置类的对应关系。
第二个方法getAutoConfigurationEntry

这里面又继续调用了这个方法

这个loadFactoryNames方法所进行的事,就是去查找META-INF/spring.factories文件中包含的JAR文件。

spring.factories在org.springframework.boot.autoconfigure的jar下

进去发现,里面有各种各样的自动配置类。

回到之前的selectImports的方法,返回的是一个数组,将这些类文件以数组形式返回。这样我们的之前在spring.factrory里面看到的那些自动配置类就全部加载到容器中了。
容器中有了这些类,我们自然是来看看这些类中都有什么东西。拿我们比较熟悉的DataSource来说。我们进入DataSourceAutoConfiguration。

圈出来的是比较重要的注解
Configuration:用来告诉容器这是一个配置类,需要加载
ConditionalOnClass:这个是自动配置里的又一个关键注解。这个注解的含义是进行条件判断。如果包含其中的类,才可以正常加载,如果不存在该类,则不加载。
EnableConfigurationProperties:开启注解ConfigurationProperties。这个注解,将其中的类,与当前的类,进行绑定,也就是说当前类可以读取绑定类的配置。我们点进去看一下。

@ConfigurationProperties(prefix = "spring.datasource")代表我们在 application.yml或properties中对他进行配置的前缀。下面的属性就是该类的配置的key。了解了这一层之后,我们想配东西的时候,但是不知道配什么的时候,直接按照此思路来看即可。
当我们的条件注解都判定成功之后,该配置类里面的配置就会生效。有的配置类里面会有@bean注解,这种直接将实体放入了容器中,实现了自动配置。
至此自动配置原理结束。
聊一聊 SpringBoot 自动配置的原理的更多相关文章
- SpringBoot自动配置的原理
Spring Boot的运行是由注解@EnableAutoConfiguration提供的它的关键功能是@Import注解. EnableAutoConfigurationImportS ...
- SpringBoot自动配置注解原理解析
1. SpringBoot启动主程序类: @SpringBootApplication public class DemoApplication { public static void main(S ...
- SpringBoot自动配置的魔法
Spring自动配置 从@SpringBootApplication注解说起 SpringBoot会根据类路径下的类自动配置,省去了编写繁琐的xml配置文件.原本基于xml配置bean的方式编程基于J ...
- SpringBoot学习(六)-->SpringBoot的自动配置的原理
Spring Boot的自动配置的原理 Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入 ...
- SpringBoot实战之SpringBoot自动配置原理
SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @Confi ...
- springBoot 自动配置原理
在之前文章中说过,springBoot会根据jar包去添加许多的自动配置,本文就来说说为什么会自动配置,自动配置的原理时什么? springBoot在运行SpringApplication对象实例化时 ...
- SpringBoot自动配置的实现原理
之前一直在用SpringBoot框架,一直感觉SpringBoot框架自动配置的功能很强大,但是并没有明白它是怎么实现自动配置的,现在有空研究了一下,大概明白了SpringBoot框架是怎么实现自动配 ...
- SpringBoot自动配置原理学习
介绍 构建Springboot项目时我们会创建一个启动类 @SpringBootApplication public class DemoApplication { public static voi ...
- 这样讲 SpringBoot 自动配置原理,你应该能明白了吧
https://juejin.im/post/5ce5effb6fb9a07f0b039a14 前言 小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题 ...
随机推荐
- springboot项目快速搭建
1. 问题描述 springboot的面世,成为Java开发者的一大福音,大大提升了开发的效率,其实springboot只是在maven的基础上,对已有的maven gav进行了封装而已,今天用最简单 ...
- Web前端_微信小程序实战开发
微信小程序开发实战教程 一.微信小程序 它是一种混合开发的方式. 是安装在微信中的程序(一个程序最多2M空间). 1.1 注册 1 2 点击立即注册:进入下方页面 3 4 点击小程序进入表单填写页 ...
- ServiceFabric极简文档-5.0 Service Fabric有状态与无状态
Service Fabric 应用程序方案 2017/08/14 作者 Edward Chen Jack Zeng Azure Service Fabric提供了一个可靠而灵活的平台,可用于编写和运行 ...
- Redis原子性写入HASH结构数据并设置过期时间
Redis中提供了原子性命令SETEX或SET来写入STRING类型数据并设置Key的过期时间: > SET key value EX NX ok > SETEX key value ok ...
- SpringBoot学习笔记2
九:创建父工程 注意:打包方式选择为pom 将创建SpringBoot常用的依赖和插件放在父工程的pom.xml,如下: <project xmlns="http://maven.ap ...
- 我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3cp8ng15g94wc
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3cp8ng15g94wc
- android开发--使用webView加载tel协议不会打开拨号盘解决
在加载url之前进行判断,url是否是tel协议开头,然后进行加载,即可打开拨号盘 mWebView.setWebViewClient(new WebViewClient() { @Override ...
- C#8.0 新增功能
连载目录 [已更新最新开发文章,点击查看详细] C#8.0提供了许多增强功能 01 Readonly 成员 可将 readonly 修饰符应用于结构的任何成员. 它指示该成员不会修改状态. 这比 ...
- [剑指offer] 23. 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 解法一:递归 二叉搜索树,后序遍历的数组中 ...
- 你真的了解 Cookie 和 Session 吗
我在做面试官的时候,曾经问过很多朋友这个问题: Cookie 和 Session 有什么区别呢?大部分的面试者应该都可以说上一两句,比如:什么是 Cookie?什么是 Session?两者的区别等. ...