spring核心与思想

news2025/2/27 23:11:47

spring核心与思想

  • Spring 是什么?
    • 什么是容器?
    • 什么是 IoC?
      • 传统程序开发
      • 传统程序开发的缺陷
      • 解决传统开发中的缺陷
      • 控制反转式程序开发
      • 对⽐总结规律
    • 理解 Spring IoC
    • DI 概念说明

Spring 是什么?

Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。
Spring 是包含了众多⼯具⽅法的 IoC 容器

什么是容器?

容器是⽤来容纳某种物品的(基本)装置

什么是 IoC?

IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器,怎么理解这句话呢,先来观察下列实例

传统程序开发

现在构建⼀辆“⻋”的程序,我们的实现思路是这样的:
在这里插入图片描述

构建⼀辆⻋(Car),然⽽⻋需要依赖⻋身(FrameWork),⽽⻋身需要依赖底盘(Bottom),⽽底盘需要依赖轮胎(Tire)

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

    public Bottom() {
         tire=new Tire();
    }

    public void init() {
        System.out.println("init bottom");
        tire.init();
    }
}
public class Framework {
    private Bottom bottom;

    public Framework() {
        bottom=new Bottom();
    }

    public void init() {
        System.out.println("init framework");
        bottom.init();
    }
}
public class Car {
    private Framework framework;

    public Car() {
        framework=new Framework();
    }

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

传统程序开发的缺陷

开始的时候轮胎的尺⼨的固定的,然⽽随着对的⻋的需求量越来越⼤,个性化需求也会越来越多,这时候我们就需要加⼯多种尺⼨的轮胎;轮胎改变之后,接着底盘,车身和汽车大小都会改变,代码实现中也会出现这种情况

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

    public Bottom(int size) {
         tire=new Tire(size);
    }

    public void init() {
        System.out.println("init bottom");
        tire.init();
    }
}
public class Framework {
    private Bottom bottom;

    public Framework(int size) {
        bottom=new Bottom(size);
    }

    public void init() {
        System.out.println("init framework");
        bottom.init();
    }
}
public class Car {
    private Framework framework;

    public Car(int size) {
        framework=new Framework(size);
    }

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

解决传统开发中的缺陷

尝试不在每个类中⾃⼰创建下级类,如果⾃⼰创建下级类就会出现当下级类发⽣改变操作,⾃⼰也要跟着修改。此时,只需要将原来由⾃⼰创建的下级类,改为传递的⽅式(也就是注⼊的⽅式),因为我们不需
要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦

控制反转式程序开发

基于以上思路,我们把调⽤汽⻋的程序示例改造⼀下,把创建⼦类的⽅式,改为注⼊传递的⽅式,具体实现代码如下

public class Tire {
    private int size = 17;

    public Tire(int size, String color) {
        this.size = size;
    }
    public void init() {
        System.out.println("size -> " + size);
    }
}
public class Bottom {
    private Tire tire;

    public Bottom(Tire tire) {
        this.tire = tire;
    }

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

    public Framework(Bottom bottom) {
        this.bottom=bottom;
    }

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

    public Car(Framework framework) {
        this.framework=framework;
    }

    public void init() {
        System.out.println("do car");
        framework.init();
    }
}
public class Test {
    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.init();
    }
}

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

在这里插入图片描述

对⽐总结规律

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

通⽤程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建Framework,Framework 创建并创建了 Bottom,依次往下,⽽改进之后的控制权发⽣的反转,不再是上级对象创建并控制下级对象了,⽽是下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想

理解 Spring IoC

Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功能

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

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

将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的⽅式相当于,每次需要⼯具,才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开发的区别

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

DI 概念说明

DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思
所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。所以,依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦

IoC 是“⽬标”也是⼀种思想,⽽⽬标和思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI就属于具体的实现

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

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

相关文章

青龙面板的安装

一、安装docker 首先,需要在服务器上安装docker。 没有服务器的可以使用虚拟机,或申请一台三丰云的免费云服务器体验一下,独立IP地址,送免备案服务,可以满足基本的使用,三丰云上还有免费虚拟主机等其他免费…

【Vue2+3入门到实战】(18)VUE之Vuex状态管理器概述、VueX的安装、核心概念 State状态代码实现 详细讲解

目录 一、[Vuex](https://vuex.vuejs.org/zh/) 概述1.是什么2.使用场景3.优势4.注意: 二、需求: 多组件共享数据1.创建项目2.创建三个组件, 目录如下3.源代码如下 三、vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index…

下载大模型,保存阿里云盘

一、解决场景 下载模型或数据集,到国内云GPU平台、阿里云盘(便于持久化储存,或者分享朋友)。 及时收藏,下次还能找到! 二、优势 此方法可以避免大文件下载到本地——占用内存,受到小带宽网络…

SpringBoot定时监听RocketMQ的NameServer

问题分析 自己在测试环境部署了RocketMQ,发现namesrv很容易挂掉,于是就想着监控,挂了就发邮件通知。查看了rocketmq-dashboard项目,发现只能监控Broker,遂放弃这一路径。于是就从报错的日志入手,发现最终可…

vue整理面试题

1. v-if/v-show的区别? v-if"表达式" 当表达式值true,v-if所作用的元素显示 否则隐藏 v-show"表达式" 当表达式值true,v-if所作用的元素显示 否则隐藏 理解: v-if控制元素显示与隐藏,通过js创建dom元素或删除…

用通俗易懂的方式讲解大模型:ChatGLM3-6B 部署指南

最近智谱 AI 对底层大模型又进行了一次升级,ChatGLM3-6B 正式发布,不仅在性能测试和各种测评的数据上有显著提升,还新增了一些新功能,包括工具调用、代码解释器等,最重要的一点是还是保持 6B 的这种低参数量&#xff0…

阿里员工:本月收入489325元,开心过年

阿里员工:本月收入489325元,开心过年 近日,一名阿里员工在社交媒体上爆料自己的本月收入,竟然高达48.9万,真是让人目瞪口呆。 震惊之余,大家都很好奇这么高收入是怎么来的,再仔细看工资单&…

C++初阶——基础知识(内联函数)

目录 1.内联函数 内联函数的示例代码 1.内联函数 是一种 C 中的函数定义方式,它告诉编译器在每个调用点上插入函数体的副本,而不是像普通函数那样在调用时跳转到函数体所在的地址执行。这样可以减少函数调用的开销,提高程序的执行效率。 …

【算法】数论---欧拉函数

什么是欧拉函数? 对于正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目,记作φ(n) φ(1)1 当m,n互质时,φ(mn)φ(m)∗φ(n) 一、求一个正整数的欧拉函数---(先对它分解质因数,然后套公式&#xf…

子网划分问题(实战超详解)_主机分配地址

文章目录: 子网划分的核心思想 第一步,考虑借几位作为子网号 第二步,确定子网的网络地址 第三步,明确网络地址,广播地址,可用IP地址范围 一些可能出现的疑问 实战 题目一 子网划分的核心思想 网络号不变,借用主机号来产生新的网络 划分前的网络:网络号主机号 划分后的网络:原网…

SpringBoot 一个注解实现数据脱敏

什么是数据脱敏 数据脱敏是指对某些敏感信息,例如姓名、身份证号码、手机号、固定电话、银行卡号、邮箱等个人信息,通过脱敏算法进行数据变形,以保护敏感隐私数据。 数据脱敏通常涉及以下几种主要方法: 替换: 将原始…

【量化】蜘蛛网策略复现

文章目录 蜘蛛网策略研报概述持仓数据整理三大商品交易所的数据统一筛选共有会员清洗数据计算研报要求数据全部代码 策略结果分析无参数策略有参数策略正做反做 MSD技术指标化 蜘蛛网策略 策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为…

Blender:从新手到专家的全方位指南

Blender,这款强大的开源3D建模和渲染软件,已经成为了CG行业的标准工具之一。它不仅拥有丰富的教程资源,而且还在不断发展和完善中。尽管Blender的教程主要集中在国外网站和YouTube上,但其全面的功能和易用性使它成为许多人的首选工…

电子邮件地址填写指南:格式与常见问题解答

一个专业的电子邮件地址是一个你只用于工作目的的通信帐户。当你给收件人发送电子邮件时,这是他们最先看到的细节之一。无论你的职位或行业如何,拥有一个专业的电子邮件地址都可以提高你和所在公司的可信度。 在本文中我们解释了专业的电子邮件地址是什么…

python基础-01

文章目录 前言一、python中的注释二、变量的数据类型1.Number(数字)2.Boolean(布尔类型)—— True 和 False3.String(字符串)4.List(列表)5.Tuple(元组)6.Dic…

wordpress日主题模版Ripro-v5 6.4开心版

RiPro主题全新V5版本,(原RiPro v2旧版已停更)是一个优秀且功能强大、速度极快,易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置,让您的网站设计体验更加舒适。同…

Mastercam各版本安装指南

Mastercam下载链接 https://pan.baidu.com/s/1OldNR0ERqJFrEN24uu3j0Q?pwd0531 1.鼠标右击【Mastercam2024(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到 Mastercam2024(64bit)】。 2.打开解压后的文件夹,鼠标右击【…

LVS那点事

LVS 原理 IPVS LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的,IPVS 是 LVS 集群系统的核心软件,它的主要作用是:安装在 Director Server 上,同时在 Director Server 上虚拟出一个 IP 地址,用户必须通过这个虚拟的…

算法基础之滑雪

滑雪 核心思想&#xff1a;记忆化搜索 状态表示&#xff1a; f[i][j] 表示所有从(i,j) 开始滑的路径的最大值 状态计算&#xff1a; 分成四个方向 f[i][j] max(f[i][j] , f[i][j1] 1) 且h[a][b] (下一个点) 必须严格小于 h[i][j] 才能滑过去 #include<iostream>#…

从仿写持久层框架到MyBatis核心源码阅读

接上篇手写持久层框架&#xff1a;https://blog.csdn.net/liwenyang1992/article/details/134884703 MyBatis源码 MyBatis架构原理&主要组件 MyBatis架构设计 MyBatis架构四层作用是什么呢&#xff1f; API接口层&#xff1a;提供API&#xff0c;增加、删除、修改、查询…