SpringBoot:自动配置源码底层原理分析

  • 声明:原文作者:yuan_404

    文章目录

    • 一、自动配置原理
      • 1 . 分析自动配置原理
      • 2 . 精髓
      • 3 . 了解:@Conditional

一、自动配置原理

  • 配置文件到底能写什么?怎么写? SpringBoot 官方文档中有大量的配置,我们无法全部记住 ,下面我们就梳理一下最核心的几个部分进行讲解。

1 . 分析自动配置原理

以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;

//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;
@Configuration(proxyBeanMethods = false)

//启动指定类的ConfigurationProperties功能;
  //进入这个ServerProperties查看,将配置文件中对应的值和ServerProperties绑定起来;
  //并把ServerProperties加入到ioc容器中
@EnableConfigurationProperties({ServerProperties.class}) 

//Spring底层@Conditional注解
  //根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;
  //这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnWebApplication(type = Type.SERVLET)

//判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnClass({CharacterEncodingFilter.class})

//判断配置文件中是否存在某个配置:server.servlet.encoding.enabled;
  //如果不存在,判断也是成立的
  //即使我们配置文件中不配置server.servlet.encoding.enabled=true,也是默认生效的;
@ConditionalOnProperty(
    prefix = "server.servlet.encoding",
    value = {"enabled"},
    matchIfMissing = true
)

public class HttpEncodingAutoConfiguration {
    //他已经和SpringBoot的配置文件映射了
    private final Encoding properties;
    //只有一个有参构造器的情况下,参数的值就会从容器中拿
    public HttpEncodingAutoConfiguration(HttpProperties properties) {
        this.properties = properties.getEncoding();
    }
    
    //给容器中添加一个组件,这个组件的某些值需要从properties中获取
    @Bean
    @ConditionalOnMissingBean //判断容器没有这个组件?
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
        return filter;
    }
 
}
  • @Configuration(proxyBeanMethods = false)
    表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件
  • @EnableConfigurationProperties({ServerProperties.class})
    启动指定类的ConfigurationProperties功能;
    进入这个ServerProperties查看,将配置文件中对应的值和ServerProperties绑定起来;
    并把ServerProperties加入到ioc容器中
  • spring底层@Conditional注解
    根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;
  • @ConditionalOnWebApplication(type = Type.SERVLET)
    这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
  • @ConditionalOnClass({CharacterEncodingFilter.class})
    判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器
  • @ConditionalOnProperty(prefix = "server.servlet.encoding", value = {"enabled"}, matchIfMissing = true)
    判断配置文件中是否存在某个配置:server.servlet.encoding.enabled;
    如果不存在,判断也是成立的
    即使我们配置文件中不配置server.servlet.encoding.enabled=true,也是默认生效的;
  • 其他的@Conditional

一句话总结 :根据当前不同的条件判断,决定这个配置类是否生效

  • 一但这个配置类生效;这个配置类就会给容器中添加各种组件;
  • 这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
  • 所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;
  • 配置文件能配置什么就可以参照某个功能对应的这个属性类
//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(
    prefix = "server",
    ignoreUnknownFields = true
)
public class ServerProperties {
    private Integer port;
    private InetAddress address;
}

比如说
需要在 yaml 文件中配置 tomcat 的端口的信息
就是 @ConfigurationProperties 中的 prefix 值 + 字段名 private Integer port + 需要配置的值
得到

server:
 port: 8080

我们去配置文件里面试试前缀,看提示

这就是自动装配的原理

2 . 精髓

  1. SpringBoot启动会加载大量的自动配置类
  2. 我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
  3. 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
  4. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性;

3 . 了解:@Conditional

了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效

@Conditional派生注解(Spring注解版原生的@Conditional作用)

作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效

那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。

我们怎么知道哪些自动配置类生效?

我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效

#开启springboot的调试类
debug=true

Positive matches:(自动配置类启用的:正匹配)

Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)

Unconditional classes: (没有条件的类)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/7253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web漏洞-文件包含漏洞超详细全解(附实例)

目录 一、导图 二、文件包含漏洞 1.脚本代码 2.原理演示 3.漏洞成因 4.检测方法 5.类型分类 三、本地文件包含漏洞的利用 <无限制本地文件包含> <有限制本地文件包含> 四、远程文件包含漏洞的利用 <无限制远程文件包含> <有限制远程文件包含…

章节2 行走数据江湖,只需一行代码

目录6. 函数填充&#xff0c;计算列6.1 excel操作6.2 pandas操作16.3 pandas操作28. 数据筛选、过滤&#xff0c;[绘图前的必备功课]8.1 excel操作8.2 Python操作http://sa.mentorx.net 蔓藤教育6. 函数填充&#xff0c;计算列 书的编号、书的名字、标价、折扣、最终价钱 最终…

windows 解决惠普主机核显无法输入VGA、HDMI信号问题

硬件环境&#xff1a;惠普288G3&#xff0c;带有独立显卡 这个二手机器买来只能独显的VGA、DP口可以输入信号&#xff0c;但是DP口不稳定&#xff0c;显示器老黑屏&#xff0c;核显的VGA、HDMI口不能输出信号&#xff0c;现在的显示器一般都是用HDMI口&#xff0c;所以就想让核…

MATLAB结构化程序设计

1、实验目的&#xff1a; 1&#xff09;巩固并加深对MATLAB语言程序设计知识的理解&#xff1b; 2&#xff09;掌握和提高MATLAB语言编程和程序调试的基本技能&#xff1b; 3&#xff09;进一步理解和运用结构化程序设计的思想和方法&#xff1b; 4&#xff09;提高运用MAT…

MySQL 存储引擎

文章目录MySQL 有哪些存储引擎&#xff1f;默认是哪个&#xff1f;MySQL 存储引擎架构MyISAM 和 InnoDB 有什么区别&#xff1f;1.是否支持行级锁2.是否支持事务3.是否支持外键4.是否支持数据库异常崩溃后的安全恢复5.是否支持 MVCC6.索引实现不一样。7.性能有差别。总结 &…

mongodb和mysql双写数据一致性问题

文章目录 我们是如何用MongoDB的如何保证双写一致性?先写数据库,再写MongoDB先写MongoDB,再写数据库用户修改操作如何保存数据如何清理新增的垃圾数据定时删除随机删除我们是如何用MongoDB的 MongoDB是一个高可用、分布式的文档数据库,用于大容量数据存储。文档存储一般用…

如何提高逻辑思维,亲测,这3个方法有效

大家觉得逻辑思维重要吗&#xff1f;我觉得&#xff0c;那太重要了&#xff01;当你提醒一个人行为或方法不对时&#xff0c;别人来句“你行你上啊”&#xff01;面对这样的不讲理&#xff0c;你该怎么让他折服&#xff1f; 我们都有太多蛮不讲理、说话模棱两可、做事一团乱麻时…

实验四 配置OSPF协议

目录 一、实验内容 二、实验环境 三、实验步骤 一、实验内容 在配置NAT实验的基础上&#xff0c;增加R0到R1的GRE VPN隧道&#xff0c;并将10.0.0.0/24网络和192.168.0.0/24网络通过GRE隧道192.168.2.0/24网络连通&#xff0c;使用OSPF协议路由&#xff0c;使得PC2能访问PC0…

投资大咖说,消费产业3个升级方向

投资大腕朱啸虎说&#xff0c;消费产业有3个升级方向 当初投资过被滴滴合并的“快的” 趣讲大白话&#xff1a;别拿大腕不当“腕儿” 【趣讲信息科技122期】 **************************** 产品为王&#xff1a;大消费领域产品和品牌竞争确实激烈&#xff0c;还有供应链竞争力 …

“我做测试开发的这一年多,月薪5K变成了24K”

我是如何开始做测试的&#xff1f; 本人就读于某普通院校&#xff0c;在大学期间就开始实习找工作&#xff0c;误打误撞进入一家做工业大数据的创业公司。 刚开始我并没有明确的职业发展方向&#xff0c;主要是做一些环境搭建的基础工作。但由于执行效率高&#xff0c;工作责…

【前端面试题——微信小程序】

目录1.请谈谈wxml与标准的html的异同&#xff1f;2.请谈谈WXSS和CSS的异同&#xff1f;3.请谈谈微信小程序主要目录和文件的作用&#xff1f;4.请谈谈小程序的双向绑定和vue的异同&#xff1f;5.简单描述下微信小程序的相关文件类型&#xff1f;6.微信小程序有哪些传值(传递数据…

VUE3 学习笔记(六)Post 实现文件下载(Delphi 后台)

目录 一、实现原理 二、前端代码实现 三、后端代码实现&#xff08;delphi&#xff09; 四、实际运行截图 正常情况下&#xff0c;下载文件是使用Get方法&#xff0c;但是&#xff0c;有时候有些场景是需要通过Post方法模拟实现文件下载。 一、实现原理 前端通过Post请求&…

【软件设计师06】数据结构与算法基础

数据结构与算法基础 考点&#xff1a;数组与矩阵、线性表、广义表、树与二叉树、图、排序与查找、算法基础与常见的算法 1. 数组 数组类型存储地址计算一维度数组a[n]a[i]的存储地址为ai*len二维数组a[m][n]a[i][j]的存储地址&#xff1b;按行存储&#xff1a;a(i*nj)*len&a…

【从零开始学习 UVM】12.2、UVM RAL(续更) —— RAL Model 结构

文章目录UVM RAL 类层次结构寄存器模型或RAL块由寄存器文件、寄存器、内存、映射&#xff08;maps&#xff09;和其他块组成。让我们详细了解每个部分以及UVM RAL模型如何提供类。 UVM库为下面提到的每个基类提供了支持。 RAL blocks相应的RAL基类memoryuvm_memAddress mapuvm…

【新2023Q2模拟题JAVA】华为OD机试 - 预订酒店

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:预订酒店 题目 放暑假了,橡…

PB语言实现控制反转(IoC)

PB语言实现控制反转(IoC) PBIoC是一个以C开发的&#xff0c;实现PB语言控制反转功能的项目。基于此项目&#xff0c;PB能够将对象的生命周期、依赖关系以及属性的加载托管给IoC容器。 1、项目构成 本项目包含的类及相应功能说明如下&#xff1a; 类名功能PBIoCIoC容器&…

WangEdtior富文本编辑器

WangEdtior官网&#xff0c;提供了vue2、vue3的安装方式>> 原生js使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><m…

echarts圆形统计图与柱状图结合

1、先展示效果图 2、直接上代码&#xff0c;copy代码进行调试便会懂&#xff08;导入echarts插件看之前的文章&#xff09; <template><div class"employee-container"><div class"top-content"><span class"top-title"&…

少儿编程 电子学会图形化编程等级考试Scratch二级真题解析(判断题)2022年12月

2022年12月scratch编程等级考试二级真题 判断题(共10题,每题2分,共20分) 26、这两端程序实现的效果是一样的 答案:对 考点分析:考查积木综合使用,重点考查逻辑运算和条件判断积木的使用,三个嵌套条件判断语句相当于是逻辑与运算中三个条件得同时满足,所以正确 27、…

将本地项目上传到远程仓库的步骤

文章目录将本地项目上传到远程仓库的步骤1.进入想上传的项目文件夹2.初始化本地仓库3.添加该项目下的所有文件4.将文件添加到本地仓库中5.添加远程仓库6.将文件更新到远程仓库上7.将本地文件推送回到指定的远程仓库中将本地项目上传到远程仓库的步骤 1.进入想上传的项目文件夹…
最新文章