【初识Spring框架】

news2024/12/23 6:21:40

🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!

欢迎志同道合的朋友一起加油喔🤺🤺🤺


目录

1. Spring框架是什么?

2. IOC 容器是什么?

2.1 计算机中的容器

2.2 IOC 容器

2.3 到底什么是控制反转呢?

3. 传统式开发

3.1 Class 汽车

3.2 Class 车身

3.3 Class 底盘

4.4 Class 轮胎

4. 控制(权)反转式开发

App(测试代码)

4.1 Class 汽车

4.2 Class 车身

4.3 Class 底盘 

4.4 Class 轮胎 

5. 总结 什么是IOC?  什么是DI?

6. IOC和DI有什么区别? (面试题)

7. Spring 是什么?如何理解 Spring?(面试题)



1. Spring框架是什么?

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应⽤程序开发起来更简单。
⽤⼀句话概括 Spring:Spring 是包含了众多工具方法的 IoC 容器。

2. IOC 容器是什么?

2.1 计算机中的容器

我们先来谈谈容器是什么,在计算机中的容器,其实和我们日常所说的容器其实是一一回事。

在日常生活中,
书架的可以用来放书、衣柜可以用来放衣服、瓶子可以用来装水,它们都是容器,而容器就是可以用来容纳东西的东西。

在计算机领域中,
List / Map 是一个用来存储数据的容器,Tomcat 是一个放 Web 程序的容器。

2.2 IOC 容器

IOC(Inversion of Control,控制反转)是一种设计原则,而IOC容器则是实现这个原则的工具或框架。

控制反转(IOC)是一种编程思想,它的主要思想是将对象的创建、配置和控制权交由一个专门的组件来完成,而不是由对象本身或使用对象的客户端完成。这个专门的组件在Spring中就是所谓的IOC容器。

IOC容器是Spring框架的核心组成部分,它负责实现控制反转原则。IOC容器负责创建对象,解析和注入依赖,管理对象的生命周期,以及实现对象之间的依赖关系。

简单来说,IOC是一种理念或原则,而IOC容器则是实现这个原则的实体或工具。在Spring中,这个工具就是Spring框架自身。

2.3 到底什么是控制反转呢?

如果我们用一种更通俗的比喻来解释控制反转,那就像是在一个餐厅里就餐。假设你是一个顾客(代码),你想要一份意大利面(依赖的对象)。在没有控制反转的情况下,你需要自己到厨房(代码中)去准备食材、烹饪、然后自己清理。你需要亲自做这一切,而且要做得对。但是如果有一个服务员(IoC容器)在这个过程中帮助你,你只需要坐在桌子前,告诉服务员你想吃什么(声明依赖),然后服务员会帮你准备,你就可以直接享用了。在这个过程中,你并不需要知道意大利面是如何准备的,也不需要自己去清理,你只需要享受你的餐点就可以了。

这就是控制反转的核心概念:你不需要自己创建和管理你需要的对象,你只需要声明你需要什么,然后容器(在这个例子中是服务员)会负责创建和管理这些对象,然后将它们提供给你。这样,你的代码就更专注于实现业务逻辑,而不是处理创建和管理对象的繁琐细节

接下来我们通过 代码层面来帮助大家理解控制反转的思想!

3. 传统式开发

假如现在我们想要造一辆汽车, 造汽车依赖于车身, 造车身又依赖于底盘, 造底盘又依赖于轮胎.....

 【代码示例】

3.1 Class 汽车

public class Car {
    private Framework framework;
    
    public Car() {
        framework = new Framework();
    }
    public static void main(String[] args) {
        // 构建并启动一辆车
        Car car = new Car();
        car.init();
    }
    // 运行
    public void init() {
        System.out.println("Car init.");
        // 依赖于车身 -> framework -> init()
        framework.init();
    }
}

3.2 Class 车身

public class Framework {
    private Bottom bottom;
 
    public Framework() {
        bottom = new Bottom();
    }
    public void init() {
        System.out.println("Framework init.");
        // 依赖于底盘 -> bottom -> init()
        bottom.init();
    }
}

3.3 Class 底盘

public class Bottom {
    private Tire tire;
 
    public Bottom() {
        tire = new Tire();
    }
    public void init() {
        System.out.println("Bottom init.");
        // 依赖于轮胎 -> tire -> init()
        tire.init();
    }
}

4.4 Class 轮胎

public class Tire {
    // 尺寸
    private int size = 16;
 
    public void init() {
        System.out.println("Tire size:" + size);
    }
}

在传统时代, 假设人们都只需要车轮大小为 16 尺寸的汽车, 此时产品经理就告诉生产线上的负责人说造 16 尺寸的轮胎就行了, 随着物质水平的提高, 人们个性化追求是必然的趋势, 有些人就可能不满足于只有 16 尺寸轮胎的汽车, 这时候就需要修改代码, 给轮胎类中的构造方法加一个 size 参数, 你想要多大尺寸的轮胎, 你传给我就好了, 接下来看代码: 

public class Tire {
    // 尺寸
    private int size = 16;
 
    public Tire(int size) {
        this.size = size;
    }
 
    public void init() {
        System.out.println("Tire size:" + size);
    }
}

>>当我给轮胎的构造方法中加上一个参数之后, 前面有着依赖关系的底盘代码就报错了, 并且整个依赖链上的所有代码都需要做出改变,  这就是传统开发的问题所在了. 代码的耦合性太强.这还只是四层调用关系的代码, 并且只修改了一个参数, 如果是十几层调用关系的代码, 并且修改多个参数, 可想而知通过传统的方式传参的问题有多大了.

>>当客户的需求越来越多时, 我该如何解决: 

我们可以将控制权交给别人, 也就是相当于把轮胎, 车身, 以及其他部分外包给别人来做,  我们就不用再去关心客户的这些多种多样的需求了. 只需要向代理厂商下订单就好了. 所以就需要用到控制(权)反转式开发.

4. 控制(权)反转式开发

这种方式的开发, 传递的参数就不再是轮胎的尺寸, 材质以及车身的颜色, 而是直接将整个轮胎对象当做参数进行传递, 轮胎, 车身怎么变化我不再关心了, 控制权我交给厂商.【代码示例】 

App(测试代码)

public class App {
    public static void main(String[] args) {
        // 程序调用
        int size = 17;
        String color = "黑色";
        String wood = "铝合金";
        TireV2 tireV2 = new TireV2(size, color, wood);
        BottomV2 bottomV2 = new BottomV2(tireV2);
        FrameworkV2 frameworkV2 = new FrameworkV2(bottomV2);
        CarV2 carV2 = new CarV2(frameworkV2);
        carV2.init();
    }
}

4.1 Class 汽车

public class CarV2 {
    private FrameworkV2 frameworkV2;
 
    public CarV2(FrameworkV2 frameworkV2) {
        // frameworkV2 = new FrameworkV2(); // 舍弃自己创建车身这种写法
        this.frameworkV2 = frameworkV2; // 控制权交给别了
    }
    public void init() {
        System.out.println("Car v2 init.");
        // 依赖于车身 -> frameworkV2 -> init()
        frameworkV2.init();
    }
}

4.2 Class 车身

public class FrameworkV2 {
 
    private BottomV2 bottomV2;
 
    public FrameworkV2(BottomV2 bottomV2) {
        this.bottomV2 = bottomV2;
    }
    public void init() {
        System.out.println("Framework v2 init.");
        // 依赖于底盘 -> bottomV2 -> init()
        bottomV2.init();
    }
}

4.3 Class 底盘 

public class BottomV2 {
    private TireV2 tireV2;
    public BottomV2(TireV2 tireV2) {
        this.tireV2 = tireV2;
    }
    public void init() {
        System.out.println("Bottom V2 init.");
        // 依赖于轮胎 -> tireV2 -> init()
        tireV2.init();
    }
}

4.4 Class 轮胎 

public class TireV2 {
    private int size;
    private String color;
    private String wood;
 
    public TireV2(int size, String color, String wood) {
        this.size = size;
        this.color = color;
        this.wood = wood;
    }
    public void init() {
        System.out.println("Tire v2 size:" + size);
    }
}

这种方式的代码, 就算客户需求再怎么多变,  我的代码也只是需要更改整个依赖链上最底层依赖的代码和测试代码即可, 中间的代码都不需要改变.

对比两种开发模式:

  1. 传统开发: 开发一辆车的时候,我们通常会先创建Car对象,然后这个Car对象会自行创建所需的Framework、Bottom等组件对象。在这种情况下,控制关系是由Car(上级对象)直接控制着Framework、Bottom等(下级对象)。对象的创建和管理都是由Car对象自行控制的。
  2. 控制反转开发: 在这种开发模式下,我们会先创建各个组件对象(如Framework、Bottom等),然后再通过IoC容器将它们注入到Car对象中。此时,下级对象(Framework、Bottom等)的创建和管理已经不再由Car对象控制,而是由IoC容器负责,这就是典型的控制反转思想(IoC思想)。Car对象只需声明它所需的依赖,不需要关心这些依赖如何创建和管理。

5. 总结 什么是IOC?  什么是DI?

IOC是"Inversion of Control"(控制反转)的缩写,是面向对象编程中的一种设计原则。这个原因在于,传统的程序设计流程是由主函数调用子函数,而在IOC的设计原则中,这个流程被反转过来,主函数变成被动,等待子函数的调用。

在Spring框架中,IOC主要表现为Dependency Injection(DI,依赖注入)。也就是说,当一个类需要使用另一个类的方法时,不再是自己创建或者查找,而是通过Spring框架来注入需要的类。这样做的好处是降低了类与类之间的耦合性,使得程序更加灵活,代码更易于测试和维护。

举个例子,假设有一个类A,它需要使用类B的方法。在传统的设计中,A需要自己创建B的实例,或者通过某种方式查找到B的实例。但在Spring的IOC原则下,A不需要知道B的任何信息,只需要声明自己需要使用B,Spring框架就会自动将B的实例注入到A中,A直接使用就可以了。

Spring的IOC容器是实现这个原则的核心,它负责创建对象,维护对象之间的关系,以及管理对象的生命周期。当你需要一个对象的时候,只需要向容器请求,容器就会返回一个已经配置好的对象。

DI是"Dependency Injection"的缩写,中文通常翻译为"依赖注入"。它是Spring框架中实现"控制反转"(IOC)原则的一种方式。

依赖注入的基本理念是,一个类不应该自己去创建或查找它所依赖的其他类的实例,而应该由外部(在Spring框架中,通常是Spring的IOC容器)负责这些实例的创建和注入。这样可以将类与类之间的耦合性降低到最低,使得代码更加灵活,更易于测试和维护。

举个例子,假设有一个类A,它需要使用类B的方法。在传统的设计中,A需要自己创建B的实例,或者通过某种方式查找到B的实例。但在依赖注入的设计中,A只需要声明自己需要使用B,Spring框架就会自动将B的实例注入到A中,A直接使用就可以了。

Spring中主要有三种依赖注入的方式:

  1. Setter注入:通过调用对象的setter方法来注入依赖。

  2. Constructor注入:通过构造器来注入依赖。

  3. Field注入:直接将依赖注入到字段中。

6. IOC和DI有什么区别? (面试题)

  1. IOC(Inversion of Control,控制反转)是一种设计思想,主要是指创建对象和管理对象之间的依赖关系的控制权由代码本身反转给了容器。IOC是一种更高层次的概念,是一种编程的思想和方法论,可以通过DI,Service Locator模式等方式实现。其主要目的是解耦,将业务代码从环境代码中解耦,使业务代码独立于特定的环境和平台。

  2. DI(Dependency Injection,依赖注入)是实现IOC的一种具体方式,是IOC的一个实现手段。通过DI,容器负责将依赖的对象实例注入到需要它的对象中。对象只需通过声明需要依赖对象,而不必亲自创建或查找。这样的话,代码就不再依赖于特定的类实例,而是依赖于接口或抽象类,从而提高了代码的模块化和可测试性。

简而言之,IOC是一种设计思想,DI是实现IOC的一种方法。在Spring框架中,DI是IOC的主要实现方式。

7. Spring 是什么?如何理解 Spring?(面试题)

Spring 是包含了众多⼯具⽅法的 IoC 容器。Spring 是⼀个 IoC(控制反转)容器,说的是对象的创建和销毁的权利都交给Spring来管理了,它本身又具备了存储对象和获取对象的能力。 

Spring两个最核心的功能:可以将对象(Bean)存入到 Spring (容器)中,也可以从 Spring(容器) 中读取到对象(Bean),以供其他业务使用。

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

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

相关文章

[Flink] Flink On Yarn(yarn-session.sh)启动错误

在Flink上启动 yarn-session.sh时出现 The number of requested virtual cores for application master 1 exceeds the maximum number of virtual cores 0 available in the Yarn Cluster.错误。 版本说明: Hadoop: 3.3.4 Flink:1.17.1 问题…

锐捷AC的部署实例

进行锐捷AC部署时,遇到了一些问题,遂记录下来,如若大家在项目过程中遇到类似问题可以对照解决。 写在前面(锐捷AC的基础配置) ac-controller //配置AC的capwap源地址信息,国家码等…

[操作系统]1.计算机系统概述

写在前面:这篇是为了复习基础知识准备的,而不是根据学校的教材走的,所以叙述有些出入的地方请见谅,该系列旨在快速梳理操作系统的基础知识和一些常见的问题点,知识框架来自于王道操作系统,后续有机会的话会继续补充 1.操作系统的基本概念 一个计算机系统可以自上而下分成四个…

go 流媒体服务搭建-01

这里写自定义目录标题 go 流媒体服务搭建-01 go 流媒体服务搭建-01 新建go 项目,配置go 版本1.19 新增main.go package mainfunc main() {}新增go.mod 文件 go mod init mym7s导入m7s 主包 go get m7s.live/engine/v4查看go.mod 文件 发现下载了一段的依赖包&…

2023年面试工具篇Postman面试题及答案

1. 说下你对Postman的了解? Postman是一种接口调试与http接口测试的工具。我们可以非常方便的用来模拟get或者post或者其他方式的请求来调试和测试接口。 Postman 的优点 •支持各种的请求类型: get、post、put、patch、delete 等 •支持在线存储数据,…

如果你当架构师,从0开始,如何做一个后台项目的架构?

前言 在40岁老架构师 尼恩的读者社群(50)中,很多小伙伴要拿高薪,这就要面试架构师,要完成架构的升级,进入架构赛道。 在架构师的面试过程中,常常会遇到下面的问题: 如果给你一个项目要你从0到1做架构&…

Python入门教程+项目实战-13.2节-集合的操作方法

目录 13.2.1 集合的常用操作方法 13.2.2 集合的查找 13.2.3 集合的添加 13.2.4 集合的删除 13.2.4 集合运算 13.2.5 知识要点 13.2.6 系统学习python 13.2.1 集合的常用操作方法 集合类型是一种抽象数据类型,抽象数据类型定义了数据类型的操作方法&#xff…

怎么把投票链接生成二维码投票链接怎么生成二维码

用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投票服务,很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

ASEMI代理英飞凌IPA50R190CE,MOS管IPA50R190CE参数

编辑-Z IPA50R190CE参数描述: 型号:IPA50R190CE 持续漏极电流:24.8A 脉冲漏极电流:63A 栅极-源极电压:20V 功耗:32W 操作和储存温度:-40~150℃ 连续二极管正向电流:8.1A 漏…

5月VR大数据:Quest 2下跌超1%,其它变化不大

Hello大家好,每月一期的VR内容/硬件大数据统计又和大家见面了。 想了解VR软硬件行情么?关注这里就对了。我们会统计Steam平台的用户及内容等数据,每月初准时为你推送,不要错过喔! 本数据报告包含:Steam VR硬…

excel相同内容单元格数值等于固定值怎么做?

如下表,让该表格所有“苹果”内容的单价都等于D3的20元,怎么批量操作? 可以使用Excel的条件格式功能来实现该需求,具体步骤如下: 1. 选中表格中所有的“苹果”单元格,可以使用鼠标拖动或者按住Ctrl键单击选…

javaScript蓝桥杯----大电影

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 一千个人眼里就有一千个哈姆雷特,小蓝最近痴迷于电影,但无奈学习任务繁重,只好先将电影收藏起来,留着以后观看,但是电影网站的收藏功能居然失效了&#xff0…

Spring架构篇--2.7 远程通信基础--使用Netty

前言:Netty 作为Nio 模型的实现,相较于Selector ,进一步将api进行封装,使用更加的简单;在平常的开发中会发现许多组件的底层通信都使用了Netty,所以就非常有必要对Netty 的使用以及其工作原理进行了解了。 …

改进YOLOv8 | 主干网络篇 | YOLOv8 更换骨干网络之 GhostNet | 从廉价操作中获取更多特征

论文地址:https://arxiv.org/abs/1911.11907 代码地址:https://github.com/huawei-noah/ghostnet 由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络(CNN)很困难。特征图中的冗余是那些成功的神经网络的重要特征,但在神经架构设计中很少研究。本文提出了一种新的G…

JVM学习笔记二

1. JVM内存参数 要求 熟悉常见的 JVM 参数,尤其和大小相关的 堆内存,按大小设置 解释: -Xms 最小堆内存(包括新生代和老年代) -Xmx 最大堆内存(包括新生代和老年代) 通常建议将 -Xms 与 -…

【复杂网络建模】——基于微博数据的影响力最大化算法(PageRank)

🤵‍♂️ 个人主页:Lingxw_w的个人主页 ✍🏻作者简介:计算机科学与技术研究生在读 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 &#x1f4a…

pdf怎么转换成word?一分钟解决

PDF文件是一种广泛使用的电子文档格式,因为它们可以保留文档的完整性和格式。但是,有时候我们需要对PDF文件进行编辑和修改,这时候就需要将其转换成Word格式。在本篇文章中,我们将讨论PDF转换Word的方法及其优缺点。 有很多在线工…

易点易动打通财务系统,打破数据孤岛,实现固定资产的账实一致

固定资产管理涉及资产的采购、验收、账务处理、折旧管理等全流程,同时也牵涉到财务系统和资产系统两大信息孤岛。这两个系统之间数据不互通,导致资产的账实信息无法同步,无法真正实现资产管理的账实一致。 固定资产系统作为固定资产管理的业务系统,负责资产的采购申请、验收入…

IDEA2023.1配置Git

一、前言 在使用新设备整理git项目时,报了以下问题,在整理项目的同时,做下记录。 二、下载git 2.1.官网下载git 官网下载地址: git官网,如下图所示: 如果选方法二, 接下来会让选择系统&#…

Halcon得出三角形内切圆

Halcon得出三角形内切圆 news2023/5/27 7:14: 目录 一、得出三角形的三个角点二、用类似尺规作图法得出三角形圆心 1、以三角形三角点画出圆形轮廓2、求出三角形轮廓与圆形轮廓之间的交点3、获得角平分线,三边角平分线交点为圆心三、求出圆心到边最短距离即半径 …