Spring 核心与设计思想

文章目录

  • 1.Spring 是什么?
  • 2.什么是容器
  • 3.什么是IoC
    • 3.1 传统程序开发
    • 3.2 IoC程序开发
    • 3.3 IoC再理解
  • 4.认识DI

1.Spring 是什么?

Spring框架是一个轻量级的企业开发的一站式解决方案,可以基于Spring解决Java EE 开发中的所有问题。
⽤⼀句大白话概括 Spring:Spring 是包含了众多⼯具⽅法的 IoC 容器
看到这,可能你对容器会有所疑问?下面解释什么是容器

2.什么是容器

容器容器是⽤来容纳某种物品的(基本)装置。水杯用来装水的,饭盒用来装大米饭;这里面的水杯、饭盒就是一个容器。
Java中包含的容器:

  • List/Map -> 数据存储容器
  • Tomcat -> Web 容器

Spring也是一个容器,Spring它是一个IoC容器。

3.什么是IoC

IoC是 Inversion of Control 的缩写,翻译回来就是“控制反转”的意思,这一听“控制反转”绝对懵逼,当时我听见时也懵逼了;不要急,看下面咱会对他进行解释。
IoC不是一种技术,而是一种设计思想。在Java开发中,IoC意味将设计好的对象交给容器控制,而不是传统的在对象内部直接控制。说白话呢,IoC就是为了减小代码的耦合度。
他是如何减小代码间的耦合呢?看下面的例子就很好理解了!

3.1 传统程序开发

假如,我们现在构建一辆车的程序,我们的思路是这样的:
在这里插入图片描述
构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身(FrameWork Class),⽽⻋身需要依赖底盘(BottomClass),⽽底盘需要依赖轮胎(Tire Class),最终程序的实现代码如下:

package traditional;public class NewCarExample {public static void main(String[] args) {Car car =new Car();car.init();}
}
//车
class Car {private Framework framework;public Car() {framework = new Framework();}public void init() {framework.init();}
}
//车身
class Framework {private Bottom Bottom;public Framework() {Bottom = new Bottom();}public void init() {Bottom.init();}
}
//底盘
class Bottom {private Tire Tire;public Bottom() {Tire = new Tire();}public void init() {Tire.init();}
}
//车轮
class Tire {private int size = 20;public void init() {System.out.println("轮胎大小是" + this.size);}
}

传统程序开发就是当我们需要什么时,我们就在需要的时候new这个类。这样写就有一个缺陷,我们代码中轮胎大小写成20,如果有一天,有客户需要30、15…这样尺寸的轮胎上,我们就要修改这上面的代码,需要在创建 Car类实例时传入size参数;这时,不仅仅需要动Car类还要动下面的其他三个类;也就是当最底层代码改动之后,整个调⽤链上的所有代码都需要修改,可谓是牵一发而动全身。这样写代码的耦合度就很高,下面再看IoC程序开发是如何解决这个问题的!

3.2 IoC程序开发

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

package IoC;import sun.dc.pr.PRError;public class NewCarExample {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();}//车static class Car {private Framework framework;public Car(Framework framework) {this.framework = framework;}public void init() {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 = 20;//自定义大小轮胎
//        public Tire(int size) {
//            this.size = size;
//        }public void init() {System.out.println("车轮大小是" + size);}}
}

在这里插入图片描述
对比传统开发和IoC开发,它们两个的不同点,传统开发中创建实例的控制权在程序员手里,而IoC开发是我不关注创建实例的事,谁给我我都能用,这也就是控制反转,看下图就很好理解了。

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car
在这里插入图片描述

3.3 IoC再理解

回到主题 Spring上,刚开始说:Spring 是包含了多个⼯具⽅法的 IoC 容器,这就是对Spring 最核⼼的总结。那如何理解“Spring 是⼀个 IoC容器”这句话呢?
既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功能:

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

Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了;而Spring 最核⼼的功能,就是如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过程.

将对象放入到容器中有什么好处呢?

将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓
库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的方式相当于,每次在需要⼯具时才现做工具,工具⽤完就扔掉,下次再⽤的时候还得重新做。

在IoC中还有一个技术被使用,只是我们潜移默化的忘记对他进行介绍了,我们下面就来看看它(DI)。

4.认识DI

DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注⼊”的意思。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cortex-M3与Aurix的堆栈

1. TC397是一个基于ARM Cortex-M3内核的微控制器芯片,其堆栈是由系统初始化代码初始化的。在ARM Cortex-M3架构中,堆栈通常由两个寄存器来管理:主堆栈指针(MSP)和进程堆栈指针(PSP)。 1.1 MSP是…

12.0、Java_IO流 - 字节数组输入输出流

12.0、Java_IO流 - 字节数组输入输出流 字节数组流: ByteArrayInputStream 和 byteArrayOutputStream 经常用在需要流和数组之间转化的情况; 字节数组输入流: 说白了,FileInputStream 是把文件当做数据源;ByteArrayInp…

【vue】路由的搭建以及嵌套路由

目的:学习搭建vue2项目基础的vue路由和嵌套路由 1.npm 安装 router npm install vue-router3.6.52.src下新建文件夹router文件夹以及文件index.js index.js import Vue from vue import VueRouter from "vue-router" import Home from ../views/Home.…

H3C-Cloud Lab实验-NAT实验

实验拓扑图: IP地址规划: 实验需求: 1. 按照图示配置 IP 地址 2. 私网 A 通过 R1 接入到互联网,私网 B 通过 R3 接入到互联网 3. 私网 A 内部存在 Vlan10 和 Vlan20,通过 R1 上单臂路由访问外部网络 4. 私网 A 通过…

【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

目录 前言 1.直接选择排序 1.1基本思想 1.2直接选择排序实现过程 1.3动图助解 1.4直接选择排序源码 2.堆排序 2.1堆排序的概念 2.2堆排序源码 前言 选择排序有两种常见的【直接选择排序】、【堆排序】 1.直接选择排序 1.1基本思想 每一次从待排序的数据元素中选出最…

(数据结构)(C++)数组——约瑟夫环求解

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>#define MaxSize 10using namespace std;void josephus(int n,int m)//一共n个人数到m的出列 {int p[MaxSize];int i,j,t;for(i0;i<n;i){p[i]i1;//构建初始序列&#xff08;1,2,3,4.....) } t0;//首次报数起始位…

接口测试原理及Postman详解

接口测试定义 接口是前后端沟通的桥梁&#xff0c;是数据传输的通道&#xff0c;包括外部接口、内部接口。内部接口又包括:上层服 务与下层服务接口&#xff0c;同级接口 生活中常见接口&#xff1a;电脑上的键盘、USB接口&#xff0c;电梯按钮&#xff0c;KFC下单 接口测试…

解决Bridge材质导入到Blender为白色的问题

文章目录 前言一、复现问题二、解决方案总结 前言 一、复现问题 在Bridge上看到一块不错的草皮, 导入成功后是白色材质: 二、解决方案 以前用这个方法导入过模型, 那时候还没启用汉化, 也没什么材质问题. 这次操作之前刚启用了汉化, 我猜是汉化导致: 取消勾选’新建数据’, 重…

layui介绍以及登录功能的实现

一. layui简介 1.1 layui介绍 Layui 是一套开源免费的 Web UI 组件库&#xff0c;采用自身轻量级模块化规范&#xff0c;遵循原生态的 HTML/CSS/JavaScript 开发模式&#xff0c;非常适合网页界面的快速构建。Layui 区别于一众主流的前端框架&#xff0c;它更多是面向于后端开…

XSS 攻击的检测和修复方法

XSS 攻击的检测和修复方法 XSS&#xff08;Cross-Site Scripting&#xff09;攻击是一种最为常见和危险的 Web 攻击&#xff0c;即攻击者通过在 Web 页面中注入恶意代码&#xff0c;使得用户在访问该页面时&#xff0c;恶意代码被执行&#xff0c;从而导致用户信息泄露、账户被…

MAYA鲨鱼的绑定

最后一个柚有问题 轴向正确的旋转&#xff0c;成C型 弄乱了 W整体移动 D单个移动 X轴没指向下一个关节 控制器创建 根控制器 控制器很好匹配关节 建组 出来了&#xff0c;控制器位置还在 确保旋转关节是0 处理层级 控制器不跟着 没办法刷蒙皮 # 错误: file: H:/Autodesk/May…

浅谈物联网在电力行业的应用

摘要&#xff1a;随着社会经济的快速发展&#xff0c;物联网技术也在各个行业中得到了广泛的应用&#xff0c;特别是在电力行业中应用物联网技术&#xff0c;也有效的促进了电力行业的现代化发展。而物联网与智能电网同样都是当代重要的高新技术以及新兴产业。所以通过对于物联…