【JavaEE进阶】Spring核心与设计思想

news2024/11/26 12:40:12

在这里插入图片描述

在这里插入图片描述


1,Spring是什么?

我们通常所说的Spring指的是 Spring Framework(Spring 框架),它是一个轻量级的 Java 开源框架,有着活跃庞⼤的社区。Spring 是为了解决企业应用开发的复杂性而创建的,不仅⽀持⼴泛的应⽤场景,还让 Java 企业级的应⽤程序开发更加简单。

如何简单地使⽤⼀句话概括 Spring:Spring 是包含了众多工具方法的 IoC 容器。

上述这句话中的有两个重点,其一是包含众多工具方法,其二是IoC容器

工具方法我们不难理解,但是IoC容器是什么?而对于IoC容器这个问题,我们将其划分为两个子问题,何为IoC?何为容器?

1.1,何为容器?

容器是用来容纳某种物品的(基本)装置。 ——来自:百度百科

在日常生活中,容器随处可见。例如,我们使用的水杯就是容器,其是用来容纳水的装置;书架也是容器,其是用来容纳书本的装置 …

而在编程中,容器也随处可见。例如,我们使用的整型数组是容器,其是用来存放整型数据的装置;map也是容器,其是用来存放键值对的装置 …

Spring 也是⼀个容器,那 Spring 是什么容器呢? Spring 是⼀个 IoC 容器。

1.2,何为IoC?

IoC 是Inversion of Control 的缩写,翻译成中⽂是控制反转的意思,也就是说 Spring 是⼀个控制反转的容器

那如何理解这控制反转呢?我们从下面这个示例进行理解。

示例前提:构建⼀辆车(Car Class),然而车需要依赖车身(FrameWork Class),而车身需要依赖底盘(Bottom Class),而底盘需要依赖轮胎(Tire Class),轮胎尺寸规定为17

实现上述示例,有两种方式,分别为传统程序开发和控制反转式程序开发。

1)传统式程序开发

传统程序开发的原理是在每个当前类中创建下级类,从而实现类与类之间的依赖关系。

传统程序开发–>最终程序的实现代码如下:

1,Car(车)类

public class Car {
    private Framework framework;
    public Car(){
        framework = new Framework();
    }
    public void init(){
        System.out.println("do car ...");
        framework.init();
    }
}

2,Framework(车身)类

public class Framework {
    private Bottom bottom;
    public Framework(){
        bottom = new Bottom();
    }
    public void init(){
        System.out.println("do framework ...");
        bottom.init();
    }
}

3,Bottom(底盘)类

public class Bottom {
    private Tire tire;
    public Bottom(){
        tire = new Tire();
    }
    public void init(){
        System.out.println("do bottom ...");
        tire.init();
    }
}

4,Tire(轮胎)类

public class Tire {
    private int size = 17;
    public Tire(){
    }
    public void init(){
        System.out.println("do tire >> size = " + size);
    }
}

5,Test(测试)类

public class Test {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }
}

6,测试运行结果

在这里插入图片描述

2)控制反转式程序开发

控制反转式程序开发的原理是将在每个当前类中创建下级类改为在当前类中传递注入下级类,从而实现类与类之间的依赖关系。

控制反转式程序开发–>最终程序的实现代码如下:

1,Car(车)类

public class Car {
    private Framework framework;
    public Car(Framework framework){
        this.framework = framework;
    }
    public void init(){
        System.out.println("do car ...");
        framework.init();
    }
}

2,Framework(车身)类

public class Framework {
    private Bottom bottom;
    public Framework(Bottom bottom){
        this.bottom = bottom;
    }
    public void init(){
        System.out.println("do framework ...");
        bottom.init();
    }
}

3,Bottom(底盘)类

public class Bottom {
    private Tire tire;
    public Bottom(Tire tire){
        this.tire = tire;
    }
    public void init(){
        System.out.println("do bottom ...");
        tire.init();
    }
}

4,Tire(轮胎)类

public class Tire {
    private int size = 17;
    public Tire(){
    }
    public void init(){
        System.out.println("do tire ... >> size = " + size);
    }
}

5,Test(测试)类

public class Test {
    public static void main(String[] args) {
        Tire tire = new Tire();
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.init();
    }
}

6,测试运行结果

在这里插入图片描述

3)传统式程序开发缺陷

在上述程序中,轮胎尺⼨的固定的,然而随着对的车的需求量越来越⼤,个性化需求也会越来越多,这时候我们就需要加工多种尺寸的轮胎。那这时就需要对上述程序代码进行更改,修改后代码如下:

1,Car(车)类

public class Car {
    private Framework framework;
    public Car(int size){
        framework = new Framework(size);
    }
    public void init(){
        System.out.println("do car ...");
        framework.init();
    }
}

2,Framework(车身)类

public class Framework {
    private Bottom bottom;
    public Framework(int size){
        bottom = new Bottom(size);
    }
    public void init(){
        System.out.println("do framework ...");
        bottom.init();
    }
}

3,Bottom(底盘)类

public class Bottom {
    private Tire tire;
    public Bottom(int size){
        tire = new Tire(size);
    }
    public void init(){
        System.out.println("do bottom ...");
        tire.init();
    }
}

4,Tire(轮胎)类

public class Tire {
    private int size = 17;
    public Tire(int size){
        this.size = size;
    }
    public void init(){
        System.out.println("do tire >> size = " + size);
    }
}

5,Test(测试)类

public class Test {
    public static void main(String[] args) {
        Car car = new Car(20);
        car.init();
    }
}

6,测试运行结果

在这里插入图片描述

根据上述修改后的代码不难看出,传统式程序开发存在的问题是:当最底层类改动之后,整个调用链上的所有代码都需要经过修改。

而控制反转式程序开发就可以很好地解决上述这个问题,⽆论底层类如何改动和变化,整个调用链是不用做任何改变的。

4)开发方式对比总结

传统式程序开发中的对象创建顺序是:Car -> Framework -> Bottom -> Tire

控制反转式程序开发中的对象创建顺序是:Tire -> Bottom -> Framework -> Car

两种方式的对比效果图:

从上面的对比中,不难看出:程序开发的实现代码,类的创建顺序是相反的。

传统式程序开发的实现代码是 Car 控制并创建了Framework,Framework 创建并创建了 Bottom,依次往下。

而控制反转式程序开发的控制权发生了反转,不再是上级对象创建并控制下级对象,而是把下级对象注⼊当前对象中,这时下级的控制权不再由上级类控制。这样无论下级类发⽣何种改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。

5)IoC归纳总结

从上面这个示例中,我们知道了什么是控制反转,以及其的实现思想。

IoC是一种思想,而不是一种技术,它的实现思想是将下级对象通过传递的方式注入到当前类当中,从而实现控制权的反转。

IoC这种思想实现了解耦合的功能,减少模块之间的依赖性,提高程序的独立性,极大地降低了程序代码的维护和调试难度。

耦合性也可被称为程序相关性,一个好的程序代码的耦合性(代码之间的相关性)是很低的,也就是说程序之间的依赖性比较弱。

IoC控制反转的深层理解:

在传统式程序开发中,我们直接在对象内部通过new方式进行创建对象,是程序主动创建并直接获取依赖对象,对象是主动地接收依赖对象,这也就是正转。

而在控制反转式程序开发中,IoC是有专门一个容器来创建并存储这些对象,也就是使用Ioc容器来控制对象的创建存储,并且帮我们查找和注入依赖对象,对象是被动的接受依赖对象,这也就是反转。


2,Spring IoC 的理解

理解清楚了什么是容器?以及什么是IoC?这两个问题,那接下来我们就接着往下讲讲如何理解Spring是一个IoC容器这句话呢?

IoC容器具备的最基本的两个功能为:将对象存储到容器中,从容器中取出对象。

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

IoC是通过IoC容器把对象的创建和调用过程交给Spring进行管理,省去了使用 “new 类名” 的方式创建对象的步骤。

归纳:Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身又具备了存储对象和获取对象的能力。

归纳:控制反转式程序开发和传统式程序开发的区别:

控制反转式程序开发是将以后操作可能使用到的所有工具类创建好并存储到IoC容器中,需要的时候直接从IoC容器中获取,使用完后放回到IoC容器中;而传统式程序开发是在每次需要的时候直接创建并使用,使用完后直接舍弃不进行保存,下次使用时需重新创建和调用。

由此可归纳出Spring IoC 的优点:

  1. 解耦合,减少类与类之间的依赖性,提高程序的独立性,降低了程序代码的维护难度。
  2. 使用更加方便,不需要再手动创建对象,也不需要关注这个对象背后的依赖关系。
  3. 效率更加高效,需要使用时直接从IoC容器中获取,使用后放回IoC容器,不需要每次使用时都重新创建。

3,DI 是什么?

DI 是Dependency Injection的缩写,翻译成中文是依赖注入的意思。

所谓依赖注入,就是 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中的行为。

依赖注入(DI)和控制反转(IoC)是从不同的角度来描述同⼀件事情。

而这件事情就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。

loC是一种思想目标,属于指导原则,要想实现该思想目标,最终还是要有可行的落地方案,而DI就属于具体的实现方式。


核心总结

1,Spring 是什么?如何理解 Spring?

解答:Spring是个流行的框架,用一句话概括Spring,Spring是包含众多方法工具的IoC容器。他有两大功能:将对象存储到容器中以及从容器中获取对象。

2,IoC 和 DI 是啥?有什么区别?

解答:IoC是Inversion of Control的缩写,译为控制反转,DI是Dependency Injection的缩写,译为依赖注入,两者是从不同的角度来描述同⼀件事情。两者区别为IoC是一种思想,而DI是IoC的一种具体实现,是动态将某种依赖注入到对象的行为。

3,Spring 最核心的功能是啥?

解答:Spring最核心的部分是IoC容器, 学Spring最核心的功能,就是学如何将对象存入到 Spring 中,再从 Spring 中获取对象的过程。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络抓包工具tcpdump

tcpdump 指令可列出经过指定网络界面的数据包文件头,可以将网络中传送的数据包的 “头” 完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来帮助你摘取有用信息。   由于它需要将网络接口设置为…

青岛大学_王卓老师【数据结构与算法】Week04_11_案例分析与实现1_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–…

STM32网络通信Web Server中SSI和CGI的应用

介绍 最近由于项目功能需要,开始研究STM32 WebServer通信以及SSI和CGI应用方法。项目结束后,主要总结浏览器与STM32之间进行通行,STM32作为服务器而浏览器做为客户端进行通行。 文件介绍 此部分的代码是根据ST官方的Web Server例程的基础上…

ubuntu配置pppoe的详细过程

虽然我的是22,其实这跟ubuntu的具体版本没什么关系 1 为什么要装pppoe联网? 联想主机装上ubuntu后发现wifi网络在启动后一段时间找不到,突然搜索不了,后来问导师才知道师妹之前就是用这个电脑,然后也碰到过。 所以不…

开发抖音短视频账号矩阵系统技术实现能解决一机一号实名认证问题?

一、短视频账号矩阵系统解决一机一号实名认证问题? 目前站在开发者角度来看问的比较多,做开发技术类矩阵saas工具,需要的多账号怎么解决,这需要从两个方面来做开发解决。 第一、从开发角度来看技术开发首先解决代理ip分发问题&a…

SPSS读取纯文本文件

纯文本文件是通用的一种格式文件,根据纯文本文件中数据的排序方式,可以将其分为自由格式和固定格式。自由格式文本文件的数据项之间必须有分隔符,固定格式数据项之间不需要分隔符。 1.以自由格式读取数据 (1)选择“文…

【嵌入式Qt开发入门】如何使用Qt进行绘制实时图表——QChart 图表

要想使用 Qt Charts,我们的 Qt 版本得使用 Qt 5.7 之后的版本。其实 Qt Charts 并不是 Qt 5.7 才有的,是在 Qt 5.7 以前只有商业版本的 Qt 才有 Qt Charts。我们能免费下载的 Qt 版本都是社区(开源)版本。 Qt Charts 很方便的绘制…

LTD233次升级|官网商城全球卖货•上传文章SEO关键字•创建下载中心

1、支持第三方支付平台Billing System,支持人民币结算外币商品 2、中文商城支持海外收货地址 3、文章批量上传支持传入 SEO关键字 4、拍卖应用支持查看竞价中的报价记录 5、新增下载文件模块 商城应用 1) 支持第三方支付平台 Billing System 在本次升级中&…

IM即时通讯+智能审批,助力企业效能提升

在企业运行中,大都会使用即时通讯去进行沟通交流,即传递文字信息、各类文档文件甚至是实时的语音和视频通话。而随着技术的不断深入,即时通讯软件越发成熟,它已经不再仅仅只是一个简单的聊天工具,而是包涵办公、协作、…

2023年测试之路,从功能测试进阶测试开发工程师,突破内卷...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试开发工程师到…

LiangGaRy-学习笔记-Day28

1、回顾知识 1.1、docker启动MySQL 安装docker #准备好二进制的包 [rootNode2 ~]# ls docker-20.10.9.tgz docker-20.10.9.tgz [rootNode2 ~]# #解压docker的二进制包 [rootNode2 ~]# tar -xf docker-20.10.9.tgz #把它移动到/usr/local/下 [rootNode2 ~]# mv docker /usr/…

《MySQL技术内幕》读书总结(一):MySQL体系结构和存储引擎

文章目录 前言:1、定义数据库和实例2、MySQL体系结构3、MySQL存储引擎InnoDBMyISAM 4、连接MySQL 前言: 该技术文章是我阅读《MySQL技术内幕 InnoDB存储引擎》第2版的总结梳理 我写这里文章的目的:书中的内容过于系统和繁琐,并不是…

小白也能轻松上手的6个流程图工具

随着信息时代的到来,流程图已经成为各行各业展示业务流程、工作流程、数据流程等必不可少的形式之一。但是对于初学者来说,学习和使用传统的流程图软件有一定的门槛,因此,本文将推荐6款适合初学者的在线流程图软件,让您…

Framework UI机制之Choreographer编舞者

Choreographer(编舞者) Choreographer(编舞者)是 Android 系统中的一个重要组件,用于协调和管理界面的动画和渲染操作的时机。它负责在界面上正确地处理和同步动画、布局和绘制操作,以保证流畅的用户体验。…

Java基础---常见的语法糖

目录 典型回答 如何解语法糖 糖块一、switch 支持 String 与枚举 糖块二、泛型 糖块三、自动装箱与拆箱 糖块四、方法变长参数 糖块五、枚举 糖块六、内部类 糖块七、条件编译 糖块八、断言 糖块九、数值字面量 糖块十、for-each 糖块十一、try-with-resource 糖…

TigerBot和ChatGLM-6B大语言模型

目录 1 TigerBot大语言模型 1.1 环境安装 1.2 模型下载 1.2.1 hugging face 网站下载 1.2.2 百度网盘下载 1.3 推理 2 ChatGLM大语言模型 2.1环境搭建 2.2 模型下载 2.3 推理 1 TigerBot大语言模型 虎博科技”发布自研多模态大模型TigerBot,开源模型、代码…

Focal Loss损失函数

目录 前言 交叉熵损失函数 平衡交叉熵 Focal Loss 代码实现 前言 Focal loss是一个常用的解决类别不平衡问题的损失函数,由何恺明提出的(论文名称:Focal Loss for Dense Object Detection),用于图像领域解决one-…

学习系统编程No.29【线程执行过程之页表详解】

引言: 北京时间:2023/7/3/14:09,刚睡醒,放假在家起床时间确实不怎么好调整,根本固定不了一点,当然通俗点说也就是根本起不来,哈哈哈,已经很少见到那种7点起来码字的情形了&#xff…

NanopcT4 系统 人脸检测实验 超详细教程 代码及操作步骤

文章目录 1.NanopcT4 系统烧写详细操作步骤2.vim 使用与 gcc 使用3.makefile 使用4.GPIO 引脚查看与连接5.使用vim 编写 LED 灯闪烁c 语言程序test1.c6.使用vim 编写 LED 灯闪烁shell 脚本程序test2.sh7.在ARM 上实现人脸检测 1.NanopcT4 系统烧写详细操作步骤 1)准备一张 8G …

口语理解任务源码详解系列(二)利用seq2seq-attention模型实现

利用seq2seq-attention模型实现 写在前面 在前文介绍了项目的数据集构建:传送门 本文利用seq2seq-attention实现:实现细节请参考论文:《Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling》 1.意…