当前位置: 首页 > news >正文

深入浅出理解Spring和SpringBoot,剖析自动配置源码

文章目录

    • 1.Spring
    • 2.SpringBoot
    • 3.小结

1.摘要
本文旨在带大家理解Spring框架和SpringBoot框架最为核心的部分,自Spring和SpringBoot问世以来,给Web开发掀起了巨大的浪潮,极大的缩短项目开发周期,下面将带大家分析Spring和SpringBoot给JavaWeb开发带来那些便利,剖析其核心思想及其中运用到哪些核心技术原理。

1.Spring

1.Spring最早是为了解决企业中J2EE开发复杂性所产生的轻量级开源框架。
它到底解决了什么主要问题呢?
来先看到高频面试题:为什么使用Spring框架进行项目开发
这个问题乍看无法回答,现在项目不都是maven直接拉取spring jar包依赖,咔咔咔一顿操作直接上手启动运行程序,写代码开发测试吗?怎么还有人问这种问题,哎有的面试官就爱问. 是不是有点麻了。。。 想要回答这个问题还是从Spring诞生的起源来答复这个问题。

Spring最早为了解决企业J2EE开发各种对象创建、相互依赖关系复杂性而诞生的一门开源性框架。 因此这个答案就是:为了避免JAVA Bean对象之间的强耦合以及频繁构建对象所带来的内存开销、以及解决对象之间复杂的依赖关系,项目中边引入了Spring框架进行开发。当然Spring AOP 还能降低系统核心业务与其他业务逻辑之间的耦合,提升项目系统的可扩展性和可维护性。

Spring 最核心的两个功能 IOC 和 AOP
IOC: 控制反转,将Java中对象之间的相互引用交由Spring容器进行控制,使用DI 依赖注入实现Bean的自动注入。比如A类 对象想要使用B对象的某个功能,传统代码开发,直接把B对象new一次在赋值给A的一个成员变量,这使得A 类和B类对象之间构成强耦合,不利于项目扩展和维护,使用Spring后,A类对象如果要使用B类对象只需要将B类的JAVA Bean注入进来就可以使用了。降低对象之间的耦合度。
AOP:面向切面编程,这个最强大的地方就是可以让开发者能够专注于开发核心业务,无需花费大量精力书写与业务逻辑无关且必需的功能代码,比如日志处理、事务管理等。
AOP的实现方式:
动态代理: 分为 JDK动态代理 和CGLIB

实现代理所用技术反射
JDK代理对象的类必须实现一个接口,CGLIB没有这个要求,SpringBoot2.X以上默认就使用CGLIB代理,当然当你手动使用注解@Autowired 注入接口对象时,系统会自动走JDK代理实现Spring AOP默认使用JDK代理。其中被代理对象不能超过65535个接口。
结合Spring6.1.3-aop.jar 源码进行简要分析,作者已经补充了中文注释,便于大家阅读。其中

	// Spring6.1.3-aop.jar 包实现动态代理具体代码。public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {// 如果不开启优化和使用代理类、存在代理接口 则直接使用JDK动态代理。其中默认是不开启优化和没有使用代理类的,因此凡是提供了接口的类代理默认都是走JDK动态代理。if (!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) {return new JdkDynamicAopProxy(config);} else {// 获取代理目标类Class<?> targetClass = config.getTargetClass();// 如果代理类为空, 直接抛出异常。if (targetClass == null) {throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");} else {// 如果代理类不是接口类型且代理类存在、代理类不是通过Lambda方式实现的内部类,则直接使用CGLIB代理, 否则使用JDK动态代理。return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) && !ClassUtils.isLambdaClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));}}}private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {Class<?>[] ifcs = config.getProxiedInterfaces();return ifcs.length == 0 || ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);}

看看外国大佬书写Java代码方法名称命名就是规范,可读性太强了。

2.SpringBoot

1.SpringBoot是为了便于快速构建项目而诞生的一个新框架,其中最为核心的两个要素就是:自动配置起步依赖
什么是自动配置?

说白了,之前使用Spring、SpringMVC等框架进行开发过程中,需要手动配置各种各样的JavaBean对象,要么是通过注解实现,要么是XML实现,要么就是两者混合实现。SpringBoot为了简化频繁手动配置这个问题,就构建出了一个自动配置功能,极大简化开发人员的配置时间,提升项目开发效率。

自动配置的原理:通过6张图带大家领略自动配置具体实现。首先是项目启动配置@SpringBootApplication注解,这个注解内置了@EnableAutoConfiguration【图一】

在这里插入图片描述
在这里插入图片描述
这个Import注解会执行selectImports方法。
在这里插入图片描述
代码执行到红色划线部分
在这里插入图片描述
代码执行到红色划线部分
在这里插入图片描述

代码执行到红色划线部分**这里就是自动配置文件读取的源头了,读取后缀 为 imports的文件**
在这里插入图片描述
朋友们,就这个org.springframework.boot.autoconfigure.AutoConfiguration.imports文件。这里补充下,SpringBoot2.5以下 采用spring.factories作为自动配置文件入口。 2.5-2.7两者混用。 2.7版本后全部使用后缀为 .imports文件作为配置文件
在这里插入图片描述
这里面几个作者配置MybatisPlus 的自动配置类。

什么是起步依赖?

简单说就是一个starter可以直接启动执行的jar包,通常命名为xxx-xxx-starter。使用者可以不用关注具体包依赖的细节,直接通过依赖一个starter依赖,完成某一个模块/功能的完整依赖导入。有效避免了手动导入依赖发生依赖之间版本冲突。starter依赖包会自动将包所使用到所有依赖包一起打包加载进来。

3.小结

本文简单扼要剖析Spring和SpringBoot最为核心的部分,随着技术日新月异,迭代升级,技术会越来越多样,但是核心思想、核心原理是几近相同或者是说短期时间内不会有太大变化,正如数学之美作者吴军所言,一味地研究技术,一生注定忙碌,研究技术背后的核心原理(他口中的道),才能掌握技术的精髓。以便不至于在茫茫大海中迷失方向,立于不败之地【作者本人吹牛】。本文就分享至此,如有问题,请于评论区交流指正。

相关文章:

深入浅出理解Spring和SpringBoot,剖析自动配置源码

文章目录 1.Spring2.SpringBoot3.小结 1.摘要 本文旨在带大家理解Spring框架和SpringBoot框架最为核心的部分&#xff0c;自Spring和SpringBoot问世以来&#xff0c;给Web开发掀起了巨大的浪潮&#xff0c;极大的缩短项目开发周期&#xff0c;下面将带大家分析Spring和SpringBo…...

Spring配置文件初始化加载(一)

1.枚举 public enum TestEnum {type_01("01", "zeroTest01ServiceImpl"),type_02("02", "zeroTest02ServiceImpl"),type_03("03", "zeroTest03ServiceImpl");private String type;private String pathClass; } …...

正则表达式 - 简介

正则表达式 - 简介 正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种用于处理字符串的强大工具&#xff0c;它允许用户通过特定的模式&#xff08;pattern&#xff09;来搜索、匹配、查找和替换文本中的数据。正则表达式广泛应用于文本编辑器…...

【电机控制器】STC8H1K芯片——ADC电压采集

【电机控制器】STC8H1K芯片——ADC电压采集 文章目录 [TOC](文章目录) 前言一、ADC1.ADC初始化1.ADC_CONTR2.ADCCFG3.ADCTIM4.代码 2.ADC读取1.ADC_RES、ADC_RESL2.代码 3.VREF电压读取——MCU工作电压1.MCU工作电压计算公式2.代码 4.ADC被转换通道的输入电压读取1.ADC被转换通…...

图像格式中的 stride 和 pix stide

最近发现media codec 解码后 yuv 的拷贝时间很大&#xff0c;进一步分析后发现底层会一个像素一个像素拷贝&#xff0c;非常花时间。用过调整解码后图像的Stride&#xff08;步幅&#xff09;后直接进行内存块拷贝&#xff0c;可以大幅缩短拷贝时间 在YUV图像格式中&#xff0c…...

传统POE供电P1摄像头实现

首先&#xff0c;我们来了解一下什么是poe供电&#xff1f;poe供电是一种通过网络线&#xff08;通常为网线&#xff09;传输电能的技术。这种技术可以省去马达、插头等传统供电设备&#xff0c;以及不需要另外的电源延长线&#xff0c;从而实现方便的供电。 那么&#xff0c…...

云计算基础:AWS入门指南

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算基础&#xff1a;AWS入门指南 云计算基础&#xff1a;AWS入门指南 云计算基础&#xff1a;AWS入门指南 引言 AWS概述 什么…...

pytorch torch.tile用法

指定各维度分别重复多少次 tile 是 PyTorch 中用于重复张量的函数。它可以沿指定的维度重复张量的元素。以下是一个示例代码&#xff0c;展示 tile 的用法&#xff1a; import torch# 创建一个张量 weight_hh torch.tensor([[1, 2], [3, 4]])# 假设批量大小为3 bs 3# 使用 …...

实战项目:通过自我学习让AI学习五子棋 - 1 - 项目定义

项目介绍 五子棋是一种博弈游戏。在棋盘上黑子和白子交替落子&#xff0c;先于在任何方向上将至少五个棋子连在一起的一方获胜。在我们这个项目中我们尝试使用自学习的方法训练出一套走五子棋的算法。 这个项目本身并无特别大的实用价值。我们的目的在于&#xff1a; 尝试自…...

统信UOS开发环境支持Electron

全面支持Electron开发环境,同时还提供了丰富的开发工具和开发资源,进一步提升工作效率。 文章目录 一、环境部署1. Electron应用开发介绍2. Electron开发环境安装安装Node.js和npm安装electron环境配置二、代码示例Electron开发案例三、常见问题一、环境部署 1. Electron应用…...

2024.11.09【BUG报错】| Fastuniq “Error in Reading pair-end FASTQ sequence!”解决方案

解决 Fastuniq 中“Error in Reading pair-end FASTQ sequence!”报错的指南 在使用 Fastuniq 进行高通量测序数据分析时&#xff0c;用户可能会遇到“Error in Reading pair-end FASTQ sequence!”的错误提示。这通常表明在读取配对的 FASTQ 序列时出现了问题。以下是一些可能…...

k8s组件原理

文章目录 1、kubernetes控制平面组件1、kube-apiserver2、etcd3、controller-manager4、schedule 2、node组件1、kubelet2、container runtime3、kube-proxy 3、附加组件1、kubedns2、dashboard 4、创建pod的原理 1、kubernetes控制平面组件 1、kube-apiserver 是公开kubernete…...

0基础跟德姆(dom)一起学AI 深度学习02-Pytorch基本使用

1 基本介绍 &#xff08;1&#xff09;什么是Pytorch? PyTorch是一个开源机器学习和深度学习框架。PyTorch 允许您使用 Python 代码操作和处理数据并编写深度学习算法&#xff0c;能够在强大的GPU加速基础上实现张量和动态神经网络。 PyTorch是一个基于 Python 的科学计算包…...

九州未来再度入选2024边缘计算TOP100

随着数智化转型的浪潮不断高涨&#xff0c;边缘计算作为推动各行业智能化升级的重要基石&#xff0c;正在成为支持万物智能化的关键点。近日&#xff0c;德本咨询(DBC)联合《互联网周刊》(CIW)与中国社会科学院信息化研究中心(CIS)&#xff0c;共同发布《2024边缘计算TOP100》榜…...

《物理化学学报》

《物理化学学报》主要刊载化学学科物理化学领域具有原创性实验和基础理论研究类文章。《物理化学学报》的办刊宗旨是引领物理化学前沿、服务国家战略需求&#xff0c;坚持正确的办刊方针&#xff0c;以促进学术交流及本学科发展为已任&#xff0c;为发现和培养科技人才服务&…...

【数据集】【YOLO】【目标检测】树木倒塌识别数据集 9957 张,YOLO道路树木断裂识别算法实战训练教程!

一、数据集介绍 【数据集】树木倒塌识别数据集 9957 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含2种分类&#xff1a;{0: fallen_tree}&#xff0c;代表倒塌或者断裂的树木。 数据集来自国内外图片网站和视频截图&#xff1b; 可用于无人机树木…...

iOS 18.2 六大新功能外媒實測|ChatGPT進化版SIRI、自製Genmoji

iOS 18.2 測試版再次帶來備受矚目的功能&#xff0c;當中包括 Image Playground、Genmoji&#xff0c;以及很多果迷都期待已久的 Siri與ChatGPT 的整合。外媒實測這些新功能的實際效果和操作體驗&#xff0c;發現當中有不少令人滿意的地方。 1&#xff09;Image Playground-圖像…...

简单介绍一下mvvm mvc mvp以及区别、历史

MVC&#xff08;Model - View - Controller&#xff09; 因MVC架构的灵活性&#xff0c;架构图形式很多&#xff0c;仅供参考 历史&#xff1a; MVC 是最早出现的软件架构模式之一&#xff0c;其历史可以追溯到 20 世纪 70 年代&#xff0c;最初被用于 Smalltalk - 80 环境。…...

达梦8-达梦数据实时同步软件(DMHS)配置-Oracle-DM8

1、安装环境 源端目的端IP地址192.168.6.111192.168.6.110系统版本Red Hat 6.4Kylin v10数据库版本Oracle11g达梦 v8系统用户Oracledmdba字符集MERICAN_AMERICA.AL32UTF8UTF-8端口15215236实例名PRODDMSERVER数据库软件目录/u01/app/oracle/opt/dmdbmsDMHS安装目录/u01/dmhs/o…...

mysql常见死锁的分析

概念: 死锁是指两个或多个事务在数据库操作过程中相互等待对方释放资源&#xff0c;而导致无法继续执行的现象。在 MySQL 中&#xff0c;死锁是较为常见的问题&#xff0c;特别是在高并发环境中。 一、识别死锁 当 MySQL 检测到死锁时&#xff0c;会自动中止其中一个事务&am…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...