Java开发为何深入人心 ?我来带你解开 Spring、IoC、DI 的秘密~

news2024/11/20 13:19:19

目录

一、什么是Spring?

1.1、什么是容器?

1.2、IoC是什么?

1.3、IoC带来了什么好处?

二、什么是DI?

2.1、IoC和DI有什么关系?


一、什么是Spring?

        一句概括,Spring 是包含了众多⼯具⽅法的 IoC 容器;

那么什么是IoC?什么是容器?

1.1、什么是容器?

        容器就是用来装某种物品的装置;例如我们所学的List,Map这种数据容器,生活中我们装水的容器杯子......

1.2、IoC是什么?

        IoC——Inversion of Control,也就是控制反转,他并不是什么技术,而是一种设计思想;简单理解,IoC思想表达的含义就是把你设计好的对象交给容器来控制,而不是像传统的在对象内部进行控制;

何为控制?要控制什么?控制就是对象的创建、初始化、销毁;传统的,创建对象是new、初始化是同各国构造器或setter赋值、销毁对象我们会直接赋值null;IoC呢?现在所有权力交由给Spring容器,也就是说,现在Spring掌握了对象的生命周期,不再是我们程序员了,何为反转?想必以及心中有数了~,反转就是,我们由对象的控制者变成了IoC的被动接受者,对象的控制权由我们程序员交给了Spring,我们甚至无法预知,全听Spring的节奏;

        举个栗子,同样是向水杯这个容器里加入水,我有两种不同的思路,一种是传统的, 一种是IoC的;

如下代码(传统的):

//杯子
class Cup {
    private Goods goods;
    public Cup(String one) {
        this.goods = new Goods(one);
    }
    public void init() {
        System.out.println("杯子初始化完成");
        goods.init();
    }
}

//放入杯子的物品
class Goods {
    private String one;
    public Goods(String one) {
        this.one = one;
    }
    public void init() {
        System.out.println("物品初始化为:" + one);
    }
}

如下代码(IoC):

//杯子
class Cup {
    private Goods goods;
    public Cup(Goods goods) {
        this.goods = goods;
    }
    public void init() {
        System.out.println("初始化Cup");
        goods.init();
    }
}

//物品
class Goods {
    private String one;
    public Goods(String one) {
        this.one = one;
    }
    public void init() {
        System.out.println("物品初始化为:" + one);
    }
}

我们来对比一下:

1.3、IoC带来了什么好处?

——解耦合~

若最顶层的代码进行了改动,如上案例中的Goods的参数进行了改动,由于Cup依赖于goods,所有Cup的代码也许要进行改动,那么一旦依赖链足够的长,整条链都要进行修改,十分麻烦;

通过IoC完美的解决了耦合问题即使修改了Goods的参数也不会影响到Cup,因为Cup的创建只需要Goods这一整个类的注入(Goods内部具体实现Cup不用关注),甚至可以让两个完全不着边的类型产生注入关系;就如刚刚所讲的Cup杯子的代码案例:传统的代码Cup和good是依赖关系(创建Cup必须传入Goods的所需的参数),你不可能去创建或修改内部的依赖(假设由Spring包装好了);但是借助IoC,我们可以自己实现一个Goods类(上面代码案例中的)注入进去

二、什么是DI?

        DI—Dependency Injection,即“依赖注入”

        一句概括,在程序运行期间,动态地将某种依赖关系注⼊到对象之中

        

2.1、IoC和DI有什么关系?

        IoC是一种设计思想,DI是具体实现技术,将这种理论思想变成了实践。例如:“今天学习真辛苦,准备吃顿好的,于是,晚上我去吃了火锅”;准备吃顿好的 就是目标和思想(IoC),晚上吃了火锅 就是具体实现(DI);具体的,你把依赖交给容器,容器帮你管理依赖,这就是依赖注入的核心,这样做,降低了开发的成本,提高了代码的复用率,提高了软件的灵活性

        要说具体的区别,emm 是有的,IoC强调的是容器中对象的控制权发生了发生反转,而DI强调的是动态的将依赖关系注入对象;广义上,IoC是一种软件开发模式,DI便是最深得人心的一种;


        

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

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

相关文章

RHCE第七天之防火墙详解

文章目录一、 基本概念二、iptables三、firewalld四、实验练习一、 基本概念 什么是防火墙?路由策略和策略路由/ipsec vpn gre hdlc ppp 硬件 iDS 在计算中,防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的…

React基础梳理,万字总结,总能帮到你~

第1章:React入门 1.1.React简介 1.英文官网: reactjs.org/2.中文官网: react.docschina.org/3.用于动态构建用户界面的 JavaScript 库(只关注于视图)4.Facebook开源 React的特点 1.声明式编码2.组件化编码3.React Native 编写原生应用4.高效(优秀的D…

CodeCraft-22 and Codeforces Round #795 (Div. 2)

A. Beat The Odds 题目链接: Problem - A - Codeforces 样例输入: 2 5 2 4 3 6 8 6 3 5 9 7 1 3样例输出: 1 0题意:给定一个长度为n的数组,我们可以对这个数组进行操作,每次操作可以删除一个数&#xff…

计算机防勒索病毒之系统主机加固篇

​ 近年来,计算机以及互联网应用在中国得到普及和发展,已经深入到社会每个角落,政府,经济,军事,社会,文化和人们生活等各方面都越来越依赖于计算机和网络,电子政务,无纸办…

如何把WPS转换成PDF格式?新手也能轻松学会的方法

WPS文件是我们工作中必不可少的,它可以编辑文本、记录数据、展示文档等等,都能更好的帮我们处理工作,不过有的时候WPS文件在不同设备上打开可能会出现格式错误或者乱码等一系列的问题,这时候我们就可以将WPS文件转换成PDF文件&…

[Leetcode] 传递信息(有向图路径)

小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的…

Python数据分析之Pandas

文章目录前言一、输入输出1.1 txt1.2 csv1.3 excel1.4 json1.5 sql1.6 html1.7 latex二、数据结构2.1 一维数据 Series2.2 二维数据 DataFrame2.2.1 数据查看2.2.2 数据遍历2.2.3 数据选取2.2.4 数据处理2.2.5 数据统计2.3 索引对象 Index2.4 时间戳 TimeStamp三、窗口函数3.1 …

【每日一题】【LeetCode】【第十天】只出现一次的数字

解决之路 题目描述 测试案例(部分) 第一次 和昨天的题目有点类似,昨天是找重复,今天是找不重复。那直接按昨天第二次思路来写这次的代码。 class Solution(object):def singleNumber(self, nums):nums.sort()for i in range(l…

在线计算lncRNA-mRNA共表达相关系数,并使用cytoscape绘制共表达网络图

长链非编码RNA(Long noncoding RNA)是一类长度大于200 nt,不编码蛋白质的RNA。LncRNA的功能多样,如图1所示,A:充当蛋白质和染色质的连接因子,引起染色质重构(chromatin remodeling);…

内存函数细节及实现

1、memcpy内存拷贝 不仅可以拷贝,还可以拷贝整型、结构体等,因为直接拷贝了内存。 因为不知道要拷贝的类型是什么,所以都用void*来接收。num是拷贝的字节数 拷贝时可任意选择dest,src,以及字节数。返回void*类型的指…

01什么是FPGA?

FPGA 是一种硬件可重构的体系结构。它的英文全称是Field Programmable Gate Array,中文名是现场可编程门阵列。 FPGA就是一个可以通过编程来改变内部结构的芯片,FPGA常年来被用作专用芯片(ASIC)的小批量替代品, 同时也…

PMP考试流程是怎么样的?

别的问题我可能不太了解,但考试流程我绝对是非常清楚了!话不多说,直接放流程给到大家,好歹通过考试了,基本的情况还是能给大家讲解一下的。希望能够给有需要的同学提供点帮助。 先把考试的流程看仔细了,之…

核心乐理---音程名称

定义 音程是连个音之间的距离,是音乐中的距离,可以便于我们描述音符间的距离,便于与他人进行沟通交流。 就好像是厘米,米这些这些物理中的长度单位一样 度 度是音程的单位。 从一个音的名字念到另一个音的名字,一共念…

瑞幸“复制”拼多多

(图片来源于网络,侵删) 来源 | 螳螂观察 文 | 叶小安 在电商界,拼多多杀出阿里京东围剿重围,奠定现今电商行业“猫狗拼”三分天下的格局,这是多少后辈们参考的范本。 在咖啡界,瑞幸凭借低价…

ESP32基于Arduino框架,SD卡+MAX98357模块+MP3播放器

ESP32基于Arduino框架,SD卡MAX98357模块MP3播放器🎬原创作者的制作教程讲解以及源码: 35 ESP32之简单的完整功能SD卡MP3播放器的制作讲解(ESP32-audioI2S库介绍)- 基于Arduino链接:https://pan.baidu.com/s…

黑产系列02-黑产画像

黑产无利不起早,在利益的驱动下黑产几乎是屡禁不止,作为风控从业人员我们需要全方位的了解黑产,了解我们的对手,才能知己知彼,接下来我将结合我多年风控经验以及查阅的相关的资源,全方位介绍下黑产以及他们…

matplot绘制动图

import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import numpy as np plt.rcParams[axes.unicode_minus] False plt.rcParams[font.sans-serif] SimHei# 准备数据 x np.linspace(0,3*np.pi,100) y1 np.sin(x) y2 np.cos(x)#创建画布和子图 …

Python用yield from 实现异步协程爬虫

文章目录一、什么是yield二、yield于列表的区别三、yield from 实现协程一、什么是yield 如果还没有怎么用过的话,直接把yield看做成一种特殊的return(PS:本质 generator(生成器)) return是返回一个值然后…

Python网络编程中getservbyport和getservbyname函数的用法

在Python的网络编程中,getservbyport()函数和getservbyname()函数是socket模块中的两个函数,因此在使用这两个函数时,需要导入socket模块。1 getservbyname()函数getservbyname()函数的作用是通过指定服务的名称获取该服务对应的端口号。相关…

BI工具+方案,这是要将大数据分析包了的节奏啊

BI工具是一个为企业提供大数据智能可视化分析功能板块的平台。虽然它提供了包括智能钻取、内存行列计算、多维动态分析等多种智能数据分析功能板块,但工具毕竟是工具,要真正地为企业所用,还需要针对企业的业务发展情况、数据分析需求等制定数…