【Java】Spring核心与设计思想

news/2024/9/16 15:10:59/

文章目录

  • Spring核心与设计思想
    • 1. Spring是什么
      • 1.1 什么是容器
      • 1.2 什么是IOC
        • 1.2.1 传统程序开发
        • 1.2.2 控制反转式程序开发
        • 1.2.3 对比总结规律
    • 1.3 理解Spring IOC
    • 1.4 DI概念说明

Spring核心与设计思想

1. Spring是什么

我们通常所说的Spring指的是Spring Framework(Spring框架),它是一个开源的框架。有着庞大而且活跃的社区,这也是长久不衰的原因。

用一句话来概括:Spring是包含了众多工具方法的IOC容器。

那么什么是容器?什么是IOC容器?

1.1 什么是容器

容器就是用来容纳某种物品。

什么是IOC?

IOC翻译成中文的意思就是“控制反转”的意思,也就是说Spring是一个控制反转的容器

1.2 什么是IOC

1.2.1 传统程序开发

假如,我们现在构架一辆”车“的容器,我们实现思路是这样的:

构建一辆车,然而车需要依赖车身,而车身需要依赖底盘,但是底盘有需要依赖轮胎,最终的程序如下:

public class NewCarExample {public static void main(String[] args) {Car car = new Car();car.init();}/*** 汽⻋对象*/static class Car {public void init() {// 依赖⻋身Framework framework = new Framework();framework.init();}}/*** ⻋身类*/static class Framework {public void init() {// 依赖底盘Bottom bottom = new Bottom();bottom.init();}}/*** 底盘类*/static class Bottom {public void init() {// 依赖轮胎Tire tire = new Tire();tire.init();}}/*** 轮胎类*/static class Tire {// 尺⼨private int size = 30;public void init() {System.out.println("轮胎尺⼨:" + size);}}
}

传统程序开发的缺陷:以上程序轮胎的尺寸是固定的,然而车的需求量越来越大,个性化需求也越来越多。这时候我们需要加工多种尺寸的轮胎

public class NewCarUpdateExample {public static void main(String[] args) {Car car = new Car(20);car.run();}/*** 汽⻋对象*/static class Car {private Framework framework;public Car(int size) {framework = new Framework(size);}public void run() {// 依赖⻋身framework.init();}}/*** ⻋身类*/static class Framework {private Bottom bottom;public Framework(int size) {bottom = new Bottom(size);}public void init() {// 依赖底盘bottom.init();}}/*** 底盘类*/static class Bottom {private Tire tire;public Bottom(int size) {tire = new Tire(size);}public void init() {// 依赖轮胎tire.init();}}/*** 轮胎类*/static class Tire {// 尺⼨private int size;public Tire(int size) {this.size = size;}public void init() {System.out.println("轮胎尺⼨:" + size);}}
}

以上程序可以看出:当底层代码改动之后,整个调用链上的所有代码都需要修改

这种问题怎么解决那?

我们可以尝试不在每个类当中创建自己的下级类,如果自己创建下级类就会出现当下级类发生改变操作,自己也要跟着修改

此时,我们只需要将原来由自己创建的下级类改为传递的方式(也就是注入的方式)因为我们不需要在当前类当中创建下级类了,所以下级类发生变化(创建或减少参数),当前类本身也无需修改任何代码,这样就完成了程序的解耦

PS:解耦指的是解决了代码的耦合性,耦合性也可以换一种叫法叫做程序的相关性。好的程序的代码耦合性是很低的,也就是代码之间实现解耦

1.2.2 控制反转式程序开发

public class IocCarExample {public static void main(String[] args) {Tire tire = new Tire(20);Bottom bottom = new Bottom(tire);Framework framework = new Framework(bottom);Car car = new Car(framework);car.run();}static class Car {private Framework framework;public Car(Framework framework) {this.framework = framework;}public void run() {framework.init();}}static class Framework {private Bottom bottom;public Framework(Bottom bottom) {this.bottom = bottom;}public void init() {bottom.init();}}static class Bottom {private Tire tire;public Bottom(Tire tire) {this.tire = tire;}public void init() {tire.init();}}static class Tire {private int size;public Tire(int size) {this.size = size;}public void init() {System.out.println("轮胎:" + size);}}
}

代码经过以上调整,无论底层如何改变,整个调用链是不用做任何变动的,这样就完成了代码的解耦,从而实现了更加灵活、通用的设计程序了

1.2.3 对比总结规律

在传统的代码当中,创建顺序是Car -> FrameWork -> Bottom -> Tire

改进的解耦之后的代码创建对象的顺序是:Tire -> Bottom -> FrameWork -> Car

我们发现一个规律:通用程序的实现代码,类的创建是反转的,传统代码Car控制并创建了FrameWork,依次往下。而改进之后的控制权发生反转不再是上级对象创建并控制下级对象了,而是下级对象注入到当前对象当中。下级的控制权不再由上级类控制了,这样即使下级类发生变化,当前类不受影响。这就是典型的控制反转,也就是IOC的实现思想

1.3 理解Spring IOC

Spring是包含了多个工具方法的IOC容器,这就是对Spring最核心的总结。那么如何理解Spring是一个IOC容器这句话?

它就具备两个最基础的功能:

  • 将对象存入到容器
  • 从容器中取出对象

也就是说学习Spring最核心的功能。就是:如何将对象存入到Spring中,再从Spring中获取到对象的过程

将对象存放到容器中的好处:将对象存储到IOC容器相当于以后可能用到的所有工具都放到仓库当中,需要的时候直接取就行了,用完再把它放入到仓库当中。而new对象的方式,相当于每次需要工具了才开始现做用完就扔掉也不会保存,下次用还需要重新做

Spring是一个IOC容器,说的是对象的创建和销毁的权利都交给Spring来管理了,它本身具备了存储对象和获取对象的能力

1.4 DI概念说明

说道IOC不得不说的一个词就是“DI”,翻译成中文就是“依赖注入”的意思

所谓依赖注入,就是IOC容器在运行期间,动态的将某种依赖关系注入到对象当中。所以依赖注入和控制反转是从不同的角度做一件事情。就是通过引入IOC容器,利用依赖注入的方式,实现对象之间的解耦

IOC是“目标”也是一种思想,而目标和思想只是一种指导原则,最终还是要有可行的落地方案,而DI就是属于具体实现


http://www.ppmy.cn/news/26798.html

相关文章

MyBatis概述环境搭建(一)

🚗MyBatis学习起始站~ 🚩本文已收录至专栏:数据库学习之旅 👍希望您能有所收获 一.什么是MyBatis (1) 引言 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDB…

02-04 周六 图解机器学习 SVM 支持向量机分类学习

02-04 周六 图解机器学习 SVM 支持向量机分类学习时间版本修改人描述2023年2月4日11:15:16V0.1宋全恒新建文档 环境搭建 首先搭建jupyter环境,方便可视化 (base) rootnode33-a100:~# docker run --name sqh-learn -d -p 10088:8888 -it 10.101.12.128/framework/ju…

生态应用:探讨 NGINX 与上下游系统集成时的开发经验

NGINX 作为一款高性能的 Web 服务器和反向代理服务器,在各种应用场景中广泛应用。随着业务的发展,我们在使用 NGINX 时,可能需要将其与其他系统进行集成,以实现更加复杂的业务需求。 本文将结合实际应用场景,探讨 NGI…

带你一步步搭建Web自动化测试框架

测试框架的设计有两种思路,一种是自底向上,从脚本逐步演变完善成框架,这种适合新手了解框架的演变过程。另一种则是自顶向下,直接设计框架结构和选取各种问题的解决方案,这种适合有较多框架事件经验的人。本章和下一张…

Linux之网络流量监控工具ntopng YUM安装

一、ntopng简介 Ntop是一种监控网络流量工具,用ntop显示网络的使用情况比其他一些网络管理软件更加直观、详细。Ntop甚至可以列出每个节点计算机的网络带宽利用率。他是一个灵活的、功能齐全的,用来监控和解决局域网问题的工具;尤其当ntop与n…

非标题党:前端Vue React 项目编程规范化配置(大厂规范)

前端项目编程规范化配置 下述例子主要是从 代码规范化 以及 git 提交规范化 两方面进行配置。内容很多,请做好心理准备 一、代码检测工具 ESLint 在我们通过 vue create “项目名” 时,我们可以通过手动配置的方式,来配置 ESLint 来对代码进…

python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()]

python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()] 效果图如下所示: 就是这个样子,一般比较少见将柱形图从上往下绘制的。可能是会为了更好的展示数据对比结果吧。这里绘图的主要思路如下: 利用ax.twinx()这个函数生成一个新的x轴…

双因素方差分析全流程

上篇文章讲述了“单因素方差分析全流程总结”,单因素方差分析只是考虑了一个自变量(定类)与一个因变量(定量)之间的关系,但是在实际问题研究中可能研究两个或者几个因素与因变量之间的关系,例如…

鼠标指针文件格式解析

鼠标指针文件格式解析 文章目录鼠标指针文件格式解析windowsico文件格式分析文件头:图像数据头段:图像数据段:Ani动态光标格式解析数据结构:anihseq **rate**LISTcur静态光标文件格式解析macOSLinuxwindows ico文件格式分析 是一…

1-MATLAB APP Design-图像的输入与输出

一、APP 界面设计展示 新建一个空白的APP,在此次的学习中,我们会用到编辑字段(文本框)、 按钮、坐标区和面板,首先在界面中拖入一个编辑字段(文本框),在文本框中输入内容:图形的输入与输出,调整背景颜色,字体的颜色为黑色,字体的大小调为25.

UG NX二次开发(C#)-CAM-不再高亮显示所有的加工特征(CAMFeature)

文章目录 1、前言2、加工特征高亮显示的示例3、获取加工特征的几何对象3.1 获取面对象并取消高亮显示3.2 获取坐标系对象并取消高亮显示4、创建一个不再高亮显示所有加工特征的方法1、前言 当我们在识别加工特征后,其默认状态是被选中的,所以是高亮显示;当我们不再选中时,…

06- OpenCV查找图像轮廓 (OpenCV基础) (机器视觉)

知识重点 灰度图转换: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)二值化: 返回两个东西,一个阈值, 一个是二值化的图: thresh, binary cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)查找轮廓: 返回两个结果,分别是轮廓和层级: c…

【C语言】浮点型数据在内存中的存储

🚀🚀🚀 如果文章对你有帮助不要忘记点赞关注收藏哦🚀🚀🚀 文章目录⭐浮点数在内存中的存储1.1 🤓举个例子:1.2浮点数存储规则🌈:对于M与E有一些特别规定1.3解释前面题目&…

STM32开发(11)----CubeMX配置独立看门狗(IWDG)

CubeMX配置独立看门狗(IWDG)前言一、独立看门狗的介绍二、实验过程1.STM32CubeMX配置独立看门狗2.代码实现3.硬件连接4.实验结果总结前言 本章介绍使用STM32CubeMX对独立看门狗定时器进行配置的方法。门狗本质上是一个定时器,提供了更高的安…

嵌入式Qt 开发一个视频播放器

上篇文章:嵌入式 Qt开发一个音乐播放器,使用Qt制作了一个音乐播放器,并在OK3568开发板上进行了运行测试,实际测试效果还不错。 本篇继续来实现一个Qt视频播放器软件,可以实现视频列表的显示与选择播放等,先…

centos7下用kvm启动Fedora36 Cloud镜像

环境 os:centos7 Arch: aarch64 安装qemu-kvm yum install qemu-kvm kvm virt-install libvirt systemctl start libvirtd.service创建镜像 下载aarch64架构的Fedora36镜像 wget https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/36/Cloud/aarch64/images/Fedora-Cl…

PaddleSlim 模型量化 源代码解读

前言:paddleslim的中文资料非常丰富,在如何使用的教学上做的非常完善。但是源码解读与解析资料却非常少,这篇博客结合源代码大家一起学习一下paddle静态离线量化的原理和方法。 目录 原理简述 支持的量化类型 支持后端 量化操作 Prepara…

基于linux内核的驱动开发

1 自动创建设备文件 创建设备文件的方式:1 手动创建 sudo mknod /dev/haha0 c 250 0 2 自动创建--》使用内核函数 linux内核为我们提供了一组内核函数,用于在模块加载时自动在/dev目录下创建响应的设备文件&…

vue-element-admin在git 上 clone 之后无法install

一. 无法install的原因因为vue-element-admin引入的富文本编辑插件所导致 由于tui-editor变更 名字 导致 依赖查询找不到对应的版本二. 解决的办法先删掉package.json中tui-editor:1.3.3找到 \src\components\MarkdownEditor\index.vue 把所有的import 替换成下面4个import cod…

【Kubernetes】【十九】安全认证

第九章 安全认证 本章节主要介绍Kubernetes的安全认证机制。 访问控制概述 ​ Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 客户端 在Kubernetes集群…