如何理解Spring?

news2024/11/15 8:21:39

Spring 是包含了众多⼯具⽅法的 IoC 容器

那何为容器呢?容器是用来容纳某种东西的装置。比如:List/Map 是数据存储容器,Tomcat 是Web 容器等等。Spring 也是⼀个容器,是⼀个 IoC 容器。

那何为IoC 呢?IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器。那控制反转具体是什么呢?下面代码举例:

构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身(FrameWork Class),⽽⻋身需要依赖底盘(Bottom Class),⽽底盘需要依赖轮胎(Tire Class),最终程序的实现代码如下:

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 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); 
      } 
  } 
}

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

既然Spring 是⼀个IoC容器,那么它有两个最核心的功能:把对象存入容器和从容器中取出对象。

当谈到IoC,必然会谈到DI,DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。从广义上老说,IoC和DI其实说的是一回事,但是也有区别的。这样理解,IoC是一种思想,而DI就是这种思想的具体实现。举个例子:今天晚上要去吃一顿好的,这就是一个思想,那今天晚上去吃海底捞吧,吃海底捞这就是DI,一种具体实现。

总结:Spring 是包含了众多⼯具⽅法的 IoC 容器,它里面包含了两个最核心的功能:将对象存入容器,从容器将对象取出来,供其它类使用。跟Spring相关的两个概念,一个是IoC,一个是DI。IoC是一种思想,而DI是这种思想的一种具体实现。

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

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

相关文章

Buildroot系列开发(四)Linux工具链剖析

内容参考:百问网 文章目录1.什么是工具链2.什么是交叉编译工具链3.ABI4. Multilib工具链5.工具链与SDK的区别6.获得适合的交叉编译工具链7.sysroot8.Toolchain内部剖析9.根文件系统与sysroot10. 工具链组成11.整体构建过程12.自定义工具链1.什么是工具链 2.什么是交…

毕业设计-基于大数据动画电影推荐系统-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

面试题:三个线程按顺序打印 ABCABC

小伙伴们好呀,最近在重新复习,整理自己的知识库,偶然看到这道面试题:三个线程按顺序打印 ABCABC,尝试着做一下,才发现自己对线程还有好多地方不懂,蓝瘦…… 🐷 思路 很明显&#xf…

Docker可视化工具Portainer安装

一、官网介绍 官方地址:https://www.portainer.io/ 致力于为开发者做最强大的docker管理平台二、在 Linux 上使用 Docker 安装 Portainer 官方文档地址:https://docs.portainer.io/start/install/server/docker/linux 1、部署前需知 (1&a…

SautinSoft JBIG2 .Net提供了解读jb2文档的API

SautinSoft JBIG2 .Net提供了解读jb2文档的API SautinSoft的JBIG2.Net是一个独立且简单的SDK,为您提供了解读jb2文档的API。该部分将使您的软件能够使用3-4个C#行将JBIG2文件的任何网页转换为照片格式:png、Tiff、jpeg。 JBIG2.Net能给我什么 节省项目开…

PyQt中的多线程QThread示例

PyQt中的多线程一、PyQt中的多线程二、创建线程2.1 设计ui界面2.2 设计工作线程2.3 主程序设计三、运行结果示例一、PyQt中的多线程 传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作&#xff0…

JAVA SCRIPT设计模式--结构型--设计模式之Proxy代理模式(12)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…

搭建LNMP平台实现负载均衡与高可用

目录 环境要求 安装服务 搭建服务 1. nfs主机操作 2. web1主机操作 3. web2主机操作 4. php主机操作 5. mysql主机操作 6. 验证1 7. lb1主机操作 8. lb2主机操作 9. 验证2 测试1 测试2 网站故障解决 验证 环境要求 实验目标:搭建LNMP平台实现负载均衡与高可用。 拓…

web课程设计——健身俱乐部健身器材网站模板(24页)HTML+CSS+JavaScript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

解析Vue项目每一个文件夹及文件的作用

使用vue-cli2.x脚手架为每个vue项目创建脚手架项目结构,项目结构目录中每个文件夹介绍如下: 1、build 文件夹 里面是对 webpack 开发和打包的相关设置,包括入口文件,输出文件,使用的模块等。 1.1 webpack.base.conf.j…

人大金仓 +用友:助力企业数智化转型,实现高质量发展

金兰组织联合解决方案集数字化浪潮下,联合解决方案已经成为这个时代的必然选择。如何依托各自产品的功能与特点,持续优化和完善解决方案能力,满足客户更多、更复杂的业务诉求,成为数字服务厂商的重要工作内容。为此,金…

我的电脑图标没了怎么办?3个方法找回消失的图标

最近,很多小伙伴都在私信小编,说他们的电脑桌面图标不见了。我的电脑图标没了怎么办?别担心。图标突然消失了,很可能是你不小心隐藏了桌面图标。这里有3个方法可以帮助你快速恢复并找到电脑图标,一起来看看吧&#xff…

现代基准测试程序种类以及使用方法

文章目录基准测试程序种类常见测试程序概述常见测试程序使用Dhrystone的使用UnixBench的使用CPU-Z的安装与使用参考文献现代计算机的性能测量极大地依赖于在其上运行的工作负载,为了测量和分析计算机系统的性能人们常常选择或构造一组能反映其工作负载特征的程序&am…

python文件转换成exe可执行的windows文件

一、介绍 python的程序需要运行环境有时候很不方便,因为要交给别人代码可能因为环境的原因运行各种问题,这里给出直接讲python程序转换成exe文件,很方便直接给执行程序就可以,也不用担心运行环境问题而运行不了 二、工具 1、安装…

[奶奶看了都会]ChatGPT保姆级注册教程

大家好,我是小卷 最近几天OpenAI发布的ChatGPT聊天机器人火出天际了,连着上了各个平台的热搜榜。这个聊天机器人最大的特点是模仿人类说话风格同时回答大量问题。 有人说ChatGPT是真正的人工智能,它不仅能和你聊天,还是写小作文…

[附源码]Python计算机毕业设计SSM基于微信平台的匿名电子投票系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

web课程设计网页规划与设计 HTML+CSS+JavaScript仿英雄联盟LOL首页(1个页面)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

第4季4:图像sensor的驱动源码解析

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、sensor驱动源码的框架 mpp定义了一整套sensor驱动的实现和封装,这里以ar0130型号的sensor为例进行说明。 1、sensor层驱动 (1)sensor层驱动位于mpp/componen…

Java基础面试题

请介绍全局变量和局部变量的区别 Java中的变量分为成员变量和局部变量,它们的区别如下: 成员变量: 成员变量是在类的范围里定义的变量;成员变量有默认初始值;未被static修饰的成员变量也叫实例变量,它存储于…

知识图谱-KGE-语义匹配-双线性模型-2019:TuckER

【paper】 TuckER: Tensor Factorization for Knowledge Graph Completion【简介】 这篇文章是英国爱丁堡大学的研究者发表于 ICML 2019 上的文章,提出了 TuckER,是一个线性的张量分解模型,对表示三元组事实的二值张量做 Tucker 分解。 背景…