当前位置: 首页 > 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…...

Go Energy 跨平台(GUI)应用编译和安装包制作

构建打包 energy cli 平台介绍描述windowNSIS安装包制作工具可通过 energy cli 安装linuxdpkg 命令系统自带macosenergy 仅生成 xxx.app系统自带 安装包制作 config/energy_[os].json是初始化应用时自动生成的应用配置文件&#xff0c;在编译和制作应用安装包时使用 Windows…...

众测遇到的一些案列漏洞

文章中涉及的敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打码处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行…...

大华乐橙设备私有平台EasyCVR视频设备轨迹回放平台支持哪些摄像机?摄像机如何选型?

在现代安全监控系统中&#xff0c;视频监控设备扮演着至关重要的角色。视频设备轨迹回放平台EasyCVR以其卓越的兼容性和灵活性&#xff0c;支持接入多种品牌和类型的摄像机。这不仅为用户提供了广泛的选择空间&#xff0c;也使得视频监控系统的构建和管理变得更加高效和便捷。本…...

实战攻略 | ClickHouse优化之FINAL查询加速

【本文作者&#xff1a;擎创科技资深研发 禹鼎侯】 查询时为什么要加FINAL 我们在使用ClickHouse存储数据时&#xff0c;通常会有一些去重的需求&#xff0c;这时候我们可以使用ReplacingMergeTree引擎。这个引擎允许你存储重复数据&#xff0c;但是在merge的时候会根据order …...

5G NR gNB 逻辑架构及其功能拆分选项

5G NR gNB 逻辑架构及其功能拆分选项 中央单元 (CU) 和分布式单元功能拆分选项RAN 分体架构的优势在哪里使用哪个拆分函数&#xff1f;参考&#xff1a; 5G NR gNB Logical Architecture and It’s Functional Split OptionsCentral Unit (CU) and Distributed Unit Functional…...

PyQt入门指南四十六 性能优化策略

在PyQt应用程序中&#xff0c;性能优化是一个重要的考虑因素&#xff0c;尤其是在处理大型数据集或复杂图形界面时。以下是一些常见的性能优化策略&#xff1a; 1. 使用延迟加载&#xff08;Lazy Loading&#xff09; 延迟加载是一种优化技术&#xff0c;只在需要时加载资源。…...

【RMA】基于知识注入和模糊学习的多模态歧义分析

abstract 多模态情感分析&#xff08;MSA&#xff09;利用互补的多模态特征来预测情感极性&#xff0c;主要涉及语言、视觉和音频三种模态。现有的多模态融合方法主要考虑不同模态的互补性&#xff0c;而忽略了模态之间的冲突所导致的歧义&#xff08;即文本模态预测积极情绪&…...

CulturalBench :一个旨在评估大型语言模型在全球不同文化背景下知识掌握情况的基准测试数据集

2024-10-04&#xff0c;为了提升大型语言模型在不同文化背景下的实用性&#xff0c;华盛顿大学、艾伦人工智能研究所等机构联合创建了CulturalBench。这个数据集包含1,227个由人类编写和验证的问题&#xff0c;覆盖了包括被边缘化地区在内的45个全球区域。CulturalBench的推出&…...

Git 入门篇(一)

前言 操作系统&#xff1a;win11 64位 与gitee搭配使用 Git 入门篇&#xff08;一&#xff09; Git 入门篇&#xff08;二&#xff09; Git 入门篇&#xff08;三&#xff09; 目录 git下载、安装与配置 下载 安装 配置 git下载、安装与配置 下载 官网&#xff1a;git-…...

一个灵活且功能强大的动画库 Popmotion

一个灵活且功能强大的动画库 Popmotion 什么是 Popmotion&#xff1f; Popmotion 是一个强大的 JavaScript 动画库&#xff0c;提供了一系列简洁的 API&#xff0c;方便开发者创建流畅的动画效果。它支持不同类型的动画&#xff0c;包括 CSS 动画、SVG 动画和 DOM 动画&#…...