初识Spring - 什么是IoC容器?

目录

一、Spring是什么?

    Spring就是包含了很多工具方法的 IoC 容器。

1. 什么是IoC,什么是容器

 2. IoC的优点 (解决耦合问题)

二、什么是Spring IoC

1. Spring IoC详解

(1)也就是学习 Spring 最核心的功能:

(2)将对象存放到容器中的好处:

(3)为什么Spring是一个IoC容器:

2. 什么是DI(Dependency Injection)


前言

     从这篇文章开始进入EE进阶的学习,内容就是学习一些企业主流的框架,首先学习框架的意义就在于可以高效的开发项目,高效就是框架最大的优势,框架也是更易用的。首先来说EE初阶学习的 servlet 其实和主流的 Spring-Boot 框架相比是有很多的不方便的地方:

1. 添加外部jar包不方便,必须要外部的jar包版本是匹配的

2. 运行和调试需要配置tomcat

3. 发布 servlet 项目需要依靠tomcat(外置web容器)运行
4. 路由配置不方便,一个访问地址对应一个 Servlet 类等等

    但是如果是一个Spring-Boot项目,此时就没有servlet的痛点。所以,学习如何高效的做出项目是很有必要的。

一、Spring是什么?

    Spring值得是 Spring Framework(Spring框架),它是开源的框架,支持广泛的应用场景,可以让Java企业的应用程序开发更简单高效。

    Spring就是包含了很多工具方法的 IoC 容器。

1. 什么是IoC,什么是容器

容器  就是用来容纳物品的一个装置。在之前的文章中也有提到,向Java集合框架中的List,Map,这就是存储数据的一个容器,还有Tomcat就Web容器。
IoC (Inversion of Control)我们需要把它翻译成 ”控制权的反转“ 的一个容器,我们可以用一个场景来解释什么是控制权的反转:有一个A对象和B对象,此时如果要使用B对象,要依赖B对象才可以使用,所以此时就需要在A对象中 new 一个B对象,也就是说 A对象控制着B对象的生命周期,用到了就去创建它,不用了就把它销毁

    但是此时如果在代码层次就有很大的问题:耦合,所谓的耦合就是A对象依赖B对象才能使用,如果B对象的构造方法改了,或者是加了参数,或者是减少了参数,此时A对象也要跟着B对象一起改变,此时的代码就称为 "高耦合"。  但是开发要求的代码是 "高内聚,低耦合"的,不能是一个代码模块改变之后,其他调用链上的代码都要跟着一起改变。

    控制权的反转的意思就是A对象不控制B对象的生命周期了,在使用A对象的时候只是给A对象传一个类似参数的东西(B对象),至于B对象的控制权交给哪个对象来控制,此时A是不关心的,所以此时就发生了一个控制(权)的反转,如下图:

 2. IoC的优点 (解决耦合问题)

    如果现在需要在程序中造一辆车,首先就有一个车身,地盘,轮胎,所以造车的时候,车是依赖于车身的,车身又依赖于地盘,此时依赖关系,如下代码:

package IoC;

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

public class Framework {
    public void init() {
        System.out.println("do framework");
        Bottom bottom = new Bottom();
        bottom.init();
    }
}
package IoC;

public class Bottom {
    public void init() {
        System.out.println("do bottom");
        Tire tire = new Tire();
        tire.init();
    }
}
package IoC;

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

    此时的轮胎的size是固定大小的,但是我如果需要一个别的尺寸的轮胎就需要在init方法中传一个size的参数,如下代码:

     但是在init方法中传入一个参数之后,此时有依赖关系的调用链中的所有的代码都有问题了,都需要改这个参数, Tire类的init方法中有了参数,Bottom类中就需要传一个参数,Bottom类中传了参数之后,Framework类中又有问题了......

     但是如果是控制权反转了,不再在car类中控制framework的生命周期,只是在需要使用的时候传这样的一个参数,此时就不会再出现耦合的现象了,如下代码:

     所以从上述代码来看:

传统的 new 对象的方式创建顺序: Car  -->  Framework  -->  Bottom -->  Tire 

IoC类的创建顺序:Tire  -->  Bottom --> Framework  -->  Car

    此时就发生了控制权的反转,代码经过上述调整,无论底层咋变化,整个程序调用链是不会做出改变的,这样就完成了代码之间的解耦,从而更加灵活,通用的设计程序了。这也就是IoC实现的思想。

二、什么是Spring IoC

1. Spring IoC详解

    既然Spring是一个IoC(控制反转)容器,重点还在 容器 身上,只要它是一个容器,此时就又两个最基本的功能:

1. 将对象存入到容器中
2. 从容器中取出对象使用

(1)也就是学习 Spring 最核心的功能:

     学习如何 将对象存到Spring中,再从Spring中获取对象的过程。

(2)将对象存放到容器中的好处:

     将对象存储在IoC容器中相当于将以后可能用到的所有工具制作好放到仓库中,需要的时候直接取即可,用完再将对象放回i仓库中,而 new 对象的方式就相当于每次需要工具的时候才开始做,用完了就扔掉,也不会进行保存,下次再使用的时候还得重新做。

这就是IoC容器和普通开发程序的区别。

(3)为什么Spring是一个IoC容器:

     指的是对象的创建和销毁的权利都交给Spring来管理了,它本身又具备了存储对象和获取对象的能力。

2. 什么是DI(Dependency Injection)

    DI 翻译成中文就是 "依赖注入" 的意思,所谓依赖注入就是 IoC 的一种具体的实现方式,就是由IoC容器在运行期间,动态将某种依赖关系注入到对象中,也就是指通过引入IoC容器,利用依赖关系注入的方式,来实现对象和对象之间的解耦。(IoC是一种思想,而DI就属于具体的实现方式)

    而具体是如何在代码层次实现的 DI 会在下一篇文章 Spring 的创建和使用中详解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis主从哨兵模式

IP 服务 用途 10.0.10.45 redis sentinel zookeeper uniquecode 主redis 10.0.10.43 redis sentinel zookeeper uniquecode 从reids-1 10.0.10.44 redis sentinel zookeeper uniquecode 从redis-2 redis主从哨兵分为两部分,redis主从和redis哨兵 redi…

【分布式】 ELK 企业级日志分析系统 二

目录 一、FilebeatELK 部署1.1 环境部署 二、grok 正则捕获插件mutate 数据修改插件multiline 多行合并插件date 时间处理插件 一、FilebeatELK 部署 1.1 环境部署 Node1节点(2C/4G):node1/192.168.137.101 Elasticsearch Node2节点&…

反常积分定义

目录 反常积分的定义 判断敛散性的方法 方法2: 例题 无界函数的反常积分 判断敛散性的方法 例题 反常积分的定义 该极限存在就表示该反常积分收敛 对于定义3,只有两个都收敛的情况下,原反常积分才收敛。 判断敛散性的方法 始终大的函数形成…

ACWing算法基础课

y总说 java不能用Scanner读入,要用Buffer.read();快十倍二十倍; y总19年5月的视频,牛13! 第一讲 基础算法 包括排序、二分、高精度、前缀和与差分、双指针算法、位运算、离散化、区间合并等内容。 快速排序 一定要先移动end(就是把大数移到右边),后移动start; 否则 先找…

【云原生|Docker系列第2篇】Docker的安装和配置

欢迎来到Docker入门系列的第二篇博客!在上一篇博客中,我们已经介绍了Docker的基本概念和作用,以及为什么它成为现代应用开发和部署的关键技术。本篇博客将着重讨论Docker的安装和配置,帮助您开始使用Docker并为您的应用程序提供一…

第十章——对象和类

面向对象编程(OOP)是一种特殊的、设计程序的概念性方法,下面是最重要的OOP特性: 抽象封装和数据隐藏多态继承代码的可重用性 为了实现这些特性并将它们组合在一起,C所做的最重要的是提供了类 采用过程性编程首先考虑…

OpenCV 入门教程:像素访问和修改

OpenCV 入门教程:像素访问和修改 导语一、像素访问1.1 获取图像的大小1.2 访问图像的像素值1.3 修改图像的像素值 二、示例应用2.1 图像反转2.2 阈值化操作 三、总结 导语 在图像处理和计算机视觉领域,像素级操作是非常重要和常见的任务之一。通过像素访…

Oracle的CentOS安装

1.CentOS环境 阿里云轻量型服务器 2核-4g内存-80G系统盘 2.Oracle下载 Oracle下载 Oracle 数据库免费 CPU 限制 Oracle 数据库免费版自动将自身限制为两个内核进行处理。例如,在具有 2 个双核 CPU(四个核)的计算机上,如果大量…

mac批量在文件名前面加相同文字?

mac批量在文件名前面加相同文字?你平时在使用电脑进行工作或者学习的时候,是不是需要做一些关于文件整理和保存的操作呢,并且还需要对一大堆的文件进行重名呢?相信很大多数小伙伴都要面对这些,经常需要将大量文件的名称…

SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 springBoot项目初步,maven构建,打包 测试

目录 引出追根溯源,过渡衔接servlet是啥?tomcat是啥? 前后端开发的模式1.开发模式:JavaWeb:MVC模型2.Web:Vue,MVVC模型3.后端相关3.1 同步与异步3.2 Controller层3.3 Service层:要加…

阐述kubernetes部署:基础设施安装

基础设施部署 持久卷的建立 请参考:《持久卷的建立》 elasticsearch部署 一、设置远程扩展字典 不使用自定义字典请忽略此步骤 首先更改ES中IK插件的配置: vi/opt/kubernetes/es/IKAnalyzer.cfg.xml 按您的实际设置的秘钥配置secret_value: …

华为配置LLDP基本功能

华为配置LLDP基本功能 1.什么是lldp协议 定义 LLDP(Link Layer Discovery Protocol)是IEEE 802.1ab中定义的链路层发现协议。LLDP是一种标准的二层发现方式,可以将本端设备的管理地址、设备标识、接口标识等信息组织起来,并发布给自己的邻居设备,邻居设备收到这些信息后将…

git提交只单个或者某几个文件的指令

git status --查看目前本地和远程仓库的差异; git add --提交某的文件,多次执行可以提交多个文件 文件名称替换 git stash -u -k --其他文件保留到本地暂存区,不进行提交 git commit -m ---针对本次修改添加注释并提交到远程仓库 gi…

在安卓手机搭建kali环境,手机变成便携式渗透神器

简介 kali是著名的黑客专用系统,一般都是直接装在物理机或者虚拟机上,我们可以尝试把kali安装在手机上,把手机打造成一个便携式渗透神器。 我们需要下载以下3款软件: (1).Termux(终端模拟器) (2).AnLinux(里边有各种安装liunx…

从零实现深度学习框架——带Attentiond的Seq2seq机器翻译

引言 本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。 要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不使用外部完备的框架前提下,实现我…

学校公寓管理系统/基于微信小程序的学校公寓管理系统

摘 要 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个学生的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作…

ChatGPT训练流程

图源:State of GPT - Microsoft Build 笔者翻译上图如下: 阶段子阶段目标备注Pre-Training--------语言建模Instruction Finetuning---------让模型能够理解自然语言指令RLHFReward Modeling奖励建模,用来代替人工打分,降低标注…

5G理论概述

文章目录 SA组网架构及协议栈4-5G核心网侧融合交互5G网络网元和设备类型,接口1、AMF(Access and Mobility Management Function),接入和移动管理功能2、SMF(Session Management function),会话管理功能3、AUSF&#xf…

2023数学建模国赛常用算法-Topsis优劣解距离法

更多国赛数学建模资料思路,关注文末! 1 优劣解距离法(TOPSIS)简介 1.1 概念 TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于…

多路转接高性能IO服务器|select|poll|epoll|模型详细实现

前言 那么这里博主先安利一下一些干货满满的专栏啦! Linux专栏https://blog.csdn.net/yu_cblog/category_11786077.html?spm1001.2014.3001.5482操作系统专栏https://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482手撕数据结构https:/…