【JavaEE】Spring核心与设计思想(控制反转式程序演示、IoC、DI)

一、什么是Spring?

通常所说的 Spring 指的是 Spring FrameworkSpring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应⽤程序开发起来更简单。

Spring的定义可以用一句话概括:Spring 是包含了众多⼯具⽅法的 IoC 容器。

1.1 什么是容器?

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

1.2 什么是IoC?

上面说了Spring是一个IoC容器

这里的IoC指的是 Inversion of Control(“控制反转”)

也就是说,Spring是一个“控制反转”的容器

1.3 Inversion of Control(“控制反转”)

为了方便理解,我们通过传统代码控制反转式的代码进行对比

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

1.3.1 传统代码实现:

public class IoCTest {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 public class Tire {private int size = 30;public void init() {System.out.println("轮胎尺寸" + size);}}
}

代码缺陷:
以上程序中,轮胎的尺⼨的固定的,然⽽随着对的⻋的需求量越来越⼤,个性化需求也会越来越多,这时候我们就需要加⼯多种尺⼨的轮胎,那这个时候就要对上⾯的程序进⾏修改了,修改后的代码如下所示:

public class IoCTest {public static void main(String[] args) {Car car = new Car(20);car.run();}static class Car {private Framework framework;public  Car(int size) {framework = new Framework(size);}public void run() {//依赖车身framework.init();}}static class Framework {private Bottom bottom;public Framework(int size) {bottom = new Bottom(size);}public void init() {bottom.init();}}static class Bottom {private Tire tire;public Bottom(int size) {tire = new Tire(size);}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);}}
}

从以上代码可以看出,以上程序的问题是:当最底层代码改动之后,整个调⽤链上的所有代码都需要修改!

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

1.3.2 控制反转式程序开发:

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

import javax.rmi.CORBA.Tie;public class IoCTest {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);}}
}

在这里插入图片描述

1.3.3 对比

在这里插入图片描述

1.4 理解IoC

在这里插入图片描述

1.5 DI

DI(Dependency Injection”依赖注入“
在这里插入图片描述

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

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

相关文章

陶瓷行业废污水处理使用MES系统的作用

陶瓷行业属于高能耗、高污染行业,生产过程中消耗大量矿产资源和能源,产生的废气、废水、废渣、粉尘等对环境造成严重污染。在近年来,全社会环保意识增强,政府出台了一系列政策、措施加大节能、减排力度,整治行业污染。…

C进阶---动态内存管理

目录 一、为什么存在动态内存分配 1.1静动态内存分配区别: 1.2静态分配的优缺点 1.3动态分配优缺点 二、动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2 对动态开辟空间的越界…

「分享学习」SpringCloudAlibaba高并发仿斗鱼直播平台实战完结

[分享学习]SpringCloudAlibaba高并发仿斗鱼直播平台实战完结 第一段:简介 Spring Cloud Alibaba是基于Spring Cloud和阿里巴巴开源技术的微效劳框架,普遍应用于大范围高并发的互联网应用系统。本文将引见如何运用Spring Cloud Alibaba构建一个高并发的仿…

DolphinDB 基于 Glibc 升级的性能优化实战案例

在高并发查询、查询需要涉及很多个分区的情况下,低版本的 glibc(低于2.23)会严重影响查询性能。需要升级 glibc 解决该问题优化性能。我们撰写了本文,通过 patchelf 工具修改可执行文件和动态库的 rpath,达到无需升级系…

【机器学习】032_多种神经网络层类型

一、密集层 每一层神经元都是上一层神经元的函数,每层每个神经元都从前一层获得所有激活的输入。 整个神经网络前一层与后一层连接在一起,构造的网络密集。 二、卷积层 假设有一张大小为axb像素的图片,上面标着一些手写数字&#xff0c…

【Vue】响应式与数据劫持

目录 前言 响应式 Vue的响应式是如何实现的 数据劫持 Vue中的data属性都具有响应式 Vue后期添加的属性如何使其具有响应式 数组的响应式处理 如何使用数组下标去修改可以具有响应式呢 前言 什么是响应式?数据劫持是什么?Vue响应式是如何实现的&a…

什么是单片机?聊聊它的历史

前言 1946年2月15日,第一台电子数字计算机 ENIAC问世,这标志着计算机时代的到来。 ENIAC 是电子管计算机,时钟频率虽然仅有 100 kHz,但能在1s 的时间内完成 5000 次加法运算。与现代的计算机相比,ENIAC有许多不足&am…

【Dynamic-datasource】Springboot多数据源整合

引入依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> </dependency> 整体pom文件&#xff1a; <?xml versi…

激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

4.3 Windows驱动开发:监控进程与线程对象操作

在内核中&#xff0c;可以使用ObRegisterCallbacks这个内核回调函数来实现监控进程和线程对象操作。通过注册一个OB_CALLBACK_REGISTRATION回调结构体&#xff0c;可以指定所需的回调函数和回调的监控类型。这个回调结构体包含了回调函数和监控的对象类型&#xff0c;还有一个A…

鸿蒙APP外包开发上线流程

鸿蒙系统的上线流程可能会根据具体的版本和平台要求而略有不同。在进行上线之前&#xff0c;开发人员应该详细了解并遵循鸿蒙生态系统的相关规定和要求。鸿蒙&#xff08;HarmonyOS&#xff09;应用的上线流程通常包括以下步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术…

OpenCV入门6——图像基本变换

文章目录 图像的放大与缩小缩放算法题目放大 图像的翻转图像的旋转仿射变换之图像平移仿射变换之获取变换矩阵仿射变换之变换矩阵之二OpenCV透视变换 图像的放大与缩小 缩放算法 # -*- coding: utf-8 -*- import cv2 import numpy as npimg cv2.imread(E://pic//4.jpg) # (600…

瞬态抑制二极管(TVS管)特性及电路应用?|深圳比创达电子EMC

瞬态抑制二极管简称TVS管(Transient Voltage Suppressor) 一、TVS管特性 瞬态抑制二极管是在稳压二极管的工艺上发展起来的,一种用途广泛的高效能保护器件。当TVS二极管的两极受到反向瞬态高能量冲击时&#xff0c;它能以皮秒量级的速度&#xff0c;将其两极间的高阻抗变为低…

qt和window抓包程序

1.思路 使用原始套接字&#xff0c;将网卡设置为混杂模式&#xff0c;监听该网卡的数据。 2. 了解协议封包和协议层 下图是tcp封包详细过程 数据包传输情况 在TCP/IP协议栈中的每一层为了能够正确解析出上层的数据包&#xff0c;从而使用一些“协议类型”来标记&#xff0c;详…

高压放大器使用方法介绍

高压放大器是一种用于放大高压信号的电子设备&#xff0c;常用于科学研究、工业应用和医疗设备等领域。它可以将低电压信号放大到较高的电压水平&#xff0c;以满足特定应用的需求。 使用高压放大器需要注意以下几个方面&#xff1a; 1.了解设备规格&#xff1a;在使用高压放大…

《视觉SLAM十四讲》-- 建图

11 建图 11.1 概述 &#xff08;1&#xff09;地图的几类用处&#xff1a; 定位&#xff1a;导航&#xff1a;机器人在地图中进行路径规划&#xff1b;避障重建交互&#xff1a;人与地图之间的互动 &#xff08;2&#xff09;几类地图 稀疏地图稠密地图语义地图 11.2 单目…

解决Jira导出csv最大限度是1000的问题

JIRA为了防止过多影响性能&#xff0c; 设置了导出CSV的上线为1000&#xff0c;影响了搜索结果导出以及RestAPI。 可以通过以下配置参数修改此限制&#xff1a; 通过JIRA管理界面的"高级设置 “设置以下参数 系统管理 > 系统 > 一般设置>高级设置找到 jira.sea…

034、test

之——全纪录 目录 之——全纪录 杂谈 正文 1.下载处理数据 2.数据集概览 3.构建自定义dataset 4.初始化网络 5.训练 杂谈 综合方法试一下。 leaves 1.下载处理数据 从官网下载数据集&#xff1a;Classify Leaves | Kaggle 解压后有一个图片集&#xff0c;一个提交示…

Codeforces Round 910 (Div. 2) --- B-E 补题记录

B - Milena and Admirer Problem - B - Codeforces 题目大意&#xff1a; 现在给出一个无序序列&#xff0c;你可以使用任意次操作将这个无序序列修改为不递减序列&#xff0c;操作为你可以使用两个数a和b来替换ai&#xff0c;序列就变为了 ai-1&#xff0c; a&#xff0c;…

【C++ Primer Plus学习记录】for循环

很多情况下都需要程序执行重复的任务&#xff0c;C中的for循环可以轻松地完成这种任务。 我们来从程序清单5.1了解for循环所做的工作&#xff0c;然后讨论它是如何工作的。 //forloop.cpp #if 1 #include<iostream> using namespace std;int main() {int i;for (i 0; …