JavaEE进阶第一课:Spring核心与设计思想

news2024/11/23 8:29:50

目录

    • 1.Spring是什么
      • 1.1什么是容器
      • 1.2什么是IoC
    • 1.3什么是DI
    • Spring的核心功能

1.Spring是什么

用官方的话来说:Spring是包含众多工具方法的IoC容器
但是仅仅这样一句话,就会让大家有许多不解?什么是IoC?什么是容器?接下来围绕这句话进行解释

1.1什么是容器

容器,顾名思义就像我们的水杯一样,可以装水也可以倒水。我们很早就接触过类似的东西,例如:
Map,List就是数据存储容器
Tomcat就是Web容器
Spring也是如此

1.2什么是IoC

IoC是控制反转的英文缩写,单单一个控制反转是没办法让我们明白IoC是什么的,这里就需要一个形象的例子来解释。
在这里插入图片描述
将上图转换为代码一般为:(为方便写一起了)

public Class Main{
	Car car;
	public void init(){
        Car car=new Car();
        car.init();
    }
}

public Class Car{
	Body body;
	public void init(){
        Body body=new Body();
        body.init();
    }
}

public Class Body{
	Bottom bottom;
	public void init(){
        Bottom bottom=new Bottom();
        bottom.init();
    }
}

public Class Bottom{
	Tire tire;
	public void init(){
        Tire tire=new Tire();
        tire.init();
    }
}

public Class Tire{
	int size=20;
	public void init(){
        //
    }
}

这么写看样子没问题,但缺有个非常大的缺陷。注意看,如果,此时我的Tire不再是固定轮胎大小,而是想根据传入的参数确定大小,就像:

public Class Tire{
	int size=20;
	public Tire(int size){
		this.size=size;
	}
	public void init(){
        //
    }
}

一旦这里修改,我们调用Tire类的Bottom类的代码也要修改,一旦Bottom要该,他的上级是不是也要修改。如果这里的上级过多,是不是牵一发而动全身了。为什么会这样,这是因为代码的耦合性太高了,所以IoC就是解代码耦合的一种思想或目标
采用IoC的思想,之前我们是把Tire对象的生命周期安排在程序员自己手中,也就是我们在Bottom里面创建现在我们把这个控制权交给Spring。这里Main里面的代码不要过多关注,只是模拟Spring的存取对象,主要是看思想。我们可以这样处理代码:
我们不再在Bottom中new Tire 而是直接给他注入一个Tire对象,往上亦是如此。

public Class Main{
	public void init(){
		Tire tire=new Tire(100);
		Bottom bottom=new Bottom(tire);
		Body body=new Body(bottom);
        Car car=new Car(body);
        car.init();
    }
}

public Class Car{
	Body body;
	public Car(Body body){
		this.body=body
	}
	
	public void init(){
        body.init();
    }
}

public Class Body{
	Bottom bottom;
	public Car(Bottom bottom){
        this.bottom=bottom;
	}
	public void init(){
        bottom.init();
    }
}

public Class Bottom{
	Tire tire;
	public Car(Tire tire){
		this.tire=tire;
	}
	public void init(){
        tire.init();
    }
}

public Class Tire{
	int size=20;
	public void init(){
        //
    }
}

按上修改后,我们再修改Tire类将不再影响Bottom,我们的代码耦合性就变低了,观察两种代码,我们可以发现一个区别:我们类的创建反过来了。
第一种是先Car再到Tire,而第二种是Tire再到Car,改进后不再是上级类创建下级类了,而是下级类创建完注入到上级类中,它实现了控制权的反转,此时下级类的改变不再影响上级,这就是IoC的思想。

1.3什么是DI

说到IoC就必须要提到的是DI,那么什么是DI呢?DI是依赖注入的英文缩写。
一般来说,IoC和DI是同一概念的不同阐述。但更细一点的话,IoC是解耦合的思想,DI是具体手段。

Spring的核心功能

想要了解Spring的核心功能,还是得归结到Spring是什么这句话上:
Spring是包含众多工具方法的IoC容器
作为容器最重要的就是存取内容。那么学习Spring就是学习他的核心:
如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过

那么这样又什么好处呢?把对象当作工具,每次创建对象都是重新制造工具,那么为何不制造好要用的时候直接用呢?Spring作为容器,把你的对象的创建和销毁的权利都交给 Spring 来管理,就可以解决这个痛点。
接下来,我会同步的更新Spring之后的内容,给你最优的学习路线,还请多多点赞和关注!

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

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

相关文章

python基础篇之字符串类型

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页:lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…

Java字节流基础详解(InputStream/OutputStream)

文章目录概念InputStream字节输入流FileInputStream文件字节输入流FileOutputStream字节输出流相关的方法(write)和构造器构造器注意事项文件拷贝概念 在Java中,字节流一般适用于处理字节数据(诸如图片、视频)&#x…

Netty入门笔记(一)BIO、NIO、AIO

一.Netty简介 Netty是由JBOSS提供的一个java开源框架Netty是一个异步的,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠性的网络IO程序Netty主要针对在TCP协议下,面向Client端的高并发应用,或者peer-to-peer场…

裁剪图片原理

FileReader HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型。 创建实例 const reader new FileReader(); 方法 事件 Blod Blob是用来支持文件操作的。简单的…

牛客每日一题(1/12)

233的字符串题目描述 读入一个正整数n,代表将字符串"abc"重复n次,形成一个长度为3n的字符串。例如n3时,形成的字符串为"abcabcabc"。请你计算该字符串中有多少个"acb"子序列。答案对10^97取模。输入描述:一个正…

【计算机网络-数据链路层】局域网(LAN)

文章目录1 局域网的概念1.1 局域网的拓扑结构1.2 局域网的传输介质1.3 局域网的介质访问控制方式(MAC)1.4 局域网的分类2 以太网(Ethernet,IEEE 802.3 标准)2.1 以太网的传输介质2.2 以太网的网卡2.3 以太网的 MAC 地址…

flutter apk 加固引发的问题

背景:Apk 加固,防止动态调试啥的,用的是 腾讯家的加固方案:应用加固,这个加固完之后 因为破壳了,所以需要重写签名;今天发现一个这样的问题:最早加固完毕安装不了提示:Failure IINST…

C语言从入门到放弃——静态通讯录实现

目录 一.功能实现 1.打印开始菜单 2.实现选择 3.初始化通讯录 4.添加、删除等功能实现 (1)添加联系人 (2)删除联系人 (3)查找联系人 (4)修改联系人 (5&#xff…

【C++】基于EasyX库的2048小游戏

文章目录0 前言1 先看一下最终的效果图2 2048核心2 EasyX库2.1 配色2.2 文字2.3 填充3 总结0 前言 最近比较迷2048小游戏,于是想自己写代码实现出来,恰好也在网上找到一个现成的2048的VS工程,但是界面做得很难看,且运行逻辑存在一…

研究发现,大多数长期 COVID 影响在感染后一年内消退

英国医学杂志今天发表的一项来自以色列的大型研究发现,轻度 COVID-19 感染后出现的大多数症状或病症会持续数月,但在一年内恢复正常。 特别是接种过疫苗的人,呼吸困难的风险较低。这通常也是轻度感染后最常见的影响。相比之下,比未…

【Day2】977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ

【Day2】977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ977有序数组的平方暴力排序双指针法209长度最小的子数组暴力解法滑动窗口法59螺旋矩阵Ⅱ977有序数组的平方 题目链接:977 题目:给你一个按 非递减顺序 排序的整数数组 nums,返…

Linux常用命令——xargs命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) xargs 给其他命令传递参数的一个过滤器 补充说明 xargs 命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道…

python--城堡保卫战

实现功能: 1:敌人的绵绵不断的前进,拿着各种各样的武器(叉子,斧头,宝剑),挥动武器攻击我方城堡,对我方城堡造成伤害! 2:我方城堡发现敌人可手动…

Linux-文件系统

Windows文件系统 在Windows下,打开“计算机”,我们看到的是一个个驱动盘符。 注意:盘符与硬件不是对应的,比如说电脑有有一块硬盘,到Windows下可以将其切成C、D、E盘,也就是一个硬盘可以放多个盘符。 Lin…

maple-example简单操作示例

好久都没写博客了,今天学习到一点新知识,在这里小编和大家分享,欢迎大家指点,这篇文章是关于 maple-example的简单操作示例,具体软件下载不做讲解,谢谢!

浅谈分辨率带宽RBW

频谱仪是射频工程师最常用的设备之一,信号的频率、功率、谐波、相位噪声等诸多射频参数都需要使用频谱仪测试。使用频谱仪时,有一个参数需要经常设置,就是分辨率带宽(Resolution BW,简称RBW)。RBW是指中频链路上最小的中频滤波器带…

Enhance the Visual Representation via Discrete Adversarial Training

在自然语言处理NLP中,AT可以从泛化中受益,我们注意到AT在NLP任务中的有优点可能来自于离散和符号输入空间。为了借鉴NLP风格AT的优势,我们提出了离散对抗训练(DAT)。DAT利用VQGAN将图像数据改为离散的类似文本的输入&a…

Vuex的学习内容

本教程使用的是vue3 1.核心概念 官网地址:https://vuex.vuejs.org/安装(固定)配置项(固定) 2. 图示关系 单一定义store对象,里面5个配置项,在任意组件可以使用. 3.案例准备 准备两个组件AddItem.vue、SubItem.vue、Main.vue 展示效果如下: AddItem代码 <template&…

STL - String容器

1. string基本概念 本质&#xff1a; string是C风格的字符串&#xff0c;而string本质上是一个类 string和char *的区别&#xff1a; char *是一个指针 string是一个类&#xff0c;类内部封装了char *,管理这个字符串&#xff0c;是一个char *型的容…

本地小说阅读网站打造

目录 一、本地小说网站总体组织框架 1、所需的VUE库和elementLib以及JQ库 2、本地目录设计 3、整体代码样式 二、正文核心代码 1、引入element 样式&#xff0c;和自定义的样式 2、引入JS 3、自定义Header组件 1&#xff09;vue 定义MyHeader组件 2&#xff09;MyHead…