初识Spring - 什么是IoC容器?

news2024/11/25 4:44:35

目录

一、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 的创建和使用中详解。

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

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

相关文章

uniapp 在app中获取经纬度

在uniapp中app端,uni.getLocation获取经纬度会有大概1-2公里的偏差,在实际项目中,有的需求对经纬度的准确度要求比较严格,研究了很多种方式,最终发现使用高德地图api的微信小程序的插件获取的准确性是最准的&#xff0…

ELK之logstash四大组件

ELK之logstash四大组件 一、grok(正则捕获插件) 1.内置正则调用 //内置正则表达式调用 %{SYNTAX:SEMANTIC}●SYNTAX代表匹配值的类型,例如,0.11可以NUMBER类型所匹配,10.222.22.25可以使用IP匹配。●SEMANTIC表示存储该值的一个变量声明&a…

第十章 如何才能写出好的代码

1、编程的本质 2、好的程序关键是 有效地分离 logic Controller 和 Data 3、代码优化 优化: 逻辑代码 控制流程: 4、编写代码的四个步骤 5、react中哪些设计模式比较常用

算法与数据结构(二)--【1】表的概念及其四种实现方式

一.表是什么 【1】定义:表,又称为线性表。线性表L是n个相同类型数据元素a(1),a(2),...,a(n)组成的有限序列。 【2】相关概念: 表长:线性表中元素的个数,n0时为空表。 【3】基本运算(共七种)&…

Linux Vim提示:E325: ATTENTION 解决方案

提示: 这是由于我们异常退出vim界面 程序异常关闭导致的 解决: 在这种情况下,您可以根据以下选项来解决问题: [O]pen Read-Only:以只读模式打开文件。这意味着您不能编辑文件,但可以查看其内容。选择此选…

Nacos (2.0版本之后)状态异常集群节点状态异常

在nacos 2.0 之后正常部署后节点状态仅有一个正常,其余均为DOWN 或者SUSPICIOUS 状态 查看日志后发现 ERROR Server check fail, please check server 192.168.172.104 ,port 9849 is available , error {} 其实是nacos 相互之间不能正常通信造成的,nacos客户端升级为2.x版…

2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n = 100。 输出:10。

2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n 100。 输出:10。 答案2023-07-11: 函数的主要思路如下: 1.若n小于等于10,则直接返回0&…

漏洞复现 || SolarView Compact 存在任意命令执行漏洞(CVE-2023-23333)

免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使…

k8s+springboot+CronJob 定时任务部署

kubernetesspringbootCronJob 定时任务配置如下代码: cronjob.yaml k8s 文件 apiVersion: batch/v1 kind: CronJob metadata:name: k8s-springboot-demonamespace: rz-dt spec:failedJobsHistoryLimit: 3 #执行失败job任务保留数量successfulJobsHistoryLimit: 5 …

etcd的使用

什么是etcd ETCD是一个分布式、可靠的key-value存储的分布式系统,用于存储分布式系统中的关键数据;当然,它不仅仅用于存储,还提供配置共享及服务发现;基于Go语言实现 。 etcd的特点 完全复制:集群中的每…

Spring Boot 系列1 -- 概念、创建和使用

目录 1. 什么是Spring Boot? 2. Spring Boot 的优点 3. Spring Boot 项目的创建 3.1 使用IDEA创建 3.2 网页版创建 4. 项目目录和项目运行 4.1 项目目录 4.2 运行项目 4.3 使用Spring Boot项目实现网页输出Hello World 5. 路径问题 1. 什么是Spring Boot? Spring …

【vue+vant使用请求loading】【vant如何关闭Toast】

vuevant使用请求loading 文档:https://vant-contrib.gitee.io/vant/v2/#/zh-CN/toast 需求:目前需求是在请求中使用toast-loading,请求完成后关闭这个toast; 问题:vant如何关闭toast呢? 解决&#xff1a…

【UE4 C++】05-添加组件

在“SCharacter.h”中添加如下代码,从而为“SCharacter”添加弹簧臂和摄像机组件。 在“SCharacter.cpp”中添加如下代码 重新生成解决方案 打开虚幻编辑器,此时在视口中可以看到新添加的摄像机组件,摄像机处于世界坐标原点,并不会…

VisProg解析:根据自然语言指令解决复杂视觉任务

VisProg:根据自然语言指令解决复杂视觉任务 1. 介绍 VisProg 是一种神经符号系统,可以根据自然语言指令解决复杂的组合视觉任务。VisProg 使用 GPT3 的上下文学习能力来生成 Python 程序,然后执行这些程序以获得解决方案和全面且可解释的基…

前端学习——css盒子模型、css3新特性、伪类、布局0711TODO

样式还是得具体使用才能理解,不然会忘记也理解不透彻;还有定位,元素溢出,浮动,布局水平&垂直对齐: css3新特性 1过渡 2 动画 3 2D、3D转换 伪类 三种定位方式 弹性布局/栅格布局

VS+QT+OpenCV+C++多线程多摄像头视频监控采集窗体

程序示例精选 VSQTOpenCV多线程多摄像头视频监控采集窗体 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQTOpenCV多线程多摄像头视频监控采集窗体>>编写代码&#xff0c;代码…

【Matlab】智能优化算法_算数优化算法AOA

【Matlab】智能优化算法_算数优化算法AOA 1.背景介绍2.数学模型2.1 初始化阶段2.2 勘探阶段2.3 开采阶段 3.文件结构4.伪代码5.详细代码及注释5.1 AOA.m5.2 func_plot.m5.3 Get_F.m5.4 initialization.m5.5 main.m 6.运行结果7.参考文献 1.背景介绍 算术是数论的基本组成部分&a…

MySQL的表操作DML,DDL

建表 mysql> create table work(-> dept_id int(11) not null comment 部门号,-> staff_id int(11) not null comment 职工号,-> work_time date not null comment 工作时间,-> wage float(8.2) not null comment 工资,-> poli_face varchar(20) not null …

软考A计划-系统集成项目管理工程师-项目成本管理-中

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

如何在本地组策略编辑器中启用或禁用剪贴板历史记录

复制粘贴是我们大家都会做的事情,可能一天要做多次。但是,如果你需要一次又一次地复制同样的几件事,你该怎么办?如何在设备上复制内容? 从Windows 10版本17666开始,微软正在解决这一问题,并将剪贴板提升到一个新的水平,只需按下Win+V,你将获得全新的剪贴板体验。 你…