java ioc怎么解释_如何理解spring ioc-程序员宅基地

技术标签: java ioc怎么解释  

什么是ioc

ioc全称是【Inversion of Control】控制反转,按照字面意思理解,将控制反转过来,这里的控制指的是什么,为什么要进行反转,ioc可以解决什么问题?要回答这些问题,我们需要先了解一下ioc为什么会产生

为什么要有ioc

java是一门面向对象的语言,我们的应用程序通过一个个对象之间的相互关联和作用来完成功能,在网上看到一个特别形象的比喻,这里借用一下:

0db17b86061bc5a3cd41e2639bcc5ac9.png

这里的每一个齿轮代表一个对象,对象之间彼此紧密咬合形成一个系统,这样的系统对象之间的耦合度非常高,所谓的耦合度就是关系的紧密程度,高耦合度带来的问题显而易见,只要有一个齿轮发生故障,其它齿轮也无法工作,进而整个系统都无法正常工作,这种牵一发而动全身情况如何才能改善呢?看下图:

317d649bfa6b688a611da8f187f385d1.png

中间这个齿轮好比一个粘合剂将其它几个齿轮粘合起来,所有的齿轮都交由中间这个齿轮管理,试着把中间这个齿轮拿掉我们可以看到这三个齿轮之间彼此毫无关系,即使一个齿轮出了故障,也不会影响到其它齿轮,中间这个齿轮就好比ioc容器,其它齿轮就是对象,可以看出引入了ioc容器,对象之间的耦合度降低了。当我们修改一个对象的时候不需要去考虑其它对象,因为它不会对其它对象造成影响。

ioc的原理

这里说到的ioc容器到底是个什么东东,又是什么让它具有如此神奇的力量?

先来看一下没有ioc容器的时候,对象A依赖对象B,A在运行到某一时刻的时候会去创建B的对象,在这里A具有主动权,它控制了对象B的创建。

引入ioc以后对象A和对象B之间没有了直接联系,当A运行的时候由ioc容器创建B对象在适当的时候注入到A中,在这里,控制权由A对象转移到了ioc容器。这也就是控制反转名称的由来。

看一个例子:

public classUserServiceImpl {

privateUserDao userDaoImpl

publicList getAllUser(){

userDaoImpl= newUserDaoImpl();

return userDaoImpl.getAllUser();

}

}

这里UserServiceImpl依赖UserDaoImpl,需要在UserServiceImpl中创建UserDaoImpl对象,对象之间的耦合性很高,如何解耦呢?

我们可以通过反射来解耦,反射可以根据类的全限定名在程序运行时创建对象,可以这样做,将类的全限定名配置在xml文件中,在程序运行时通过反射读取该类的全限定名,动态的创建对象,赋值给userDao接口userDaoImpl.这样做后UserServiceImpl和UserDaoImpl之间没有了直接的关系,当我们需要替换UserDaoImpl对象的时候只需要在配置文件中去修改类的全限定名就可以了,非常的灵活方便,ioc容器的实现就是这个原理。

Ioc容器可以自动的帮我们完成以上一系列操作,我们需要做的就是通过配置文件告诉ioc需要创建哪个类以及类和类之间的关系。

控制反转和依赖注入

在这里需要提到一个概念依赖注入,很多初学者搞不清楚控制反转和依赖注入之间的关系,其实他们是对同一事务的不同角度的描述。

控制反转是一种设计思想而依赖注入是这种思想的具体实现

具体说控制反转就是将创建userDaoImpl对象的控制权反转过来由UserServiceImpl交给了ioc容器,强调的是一种能力和思想,ioc容器具有了控制权。

依赖注入就是ioc容器将UserServiceImpl所依赖的对象userDaoImpl,注入给UserServiceImpl,强调的是一个过程和实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36211244/article/details/115069940

智能推荐

The Leaky Integrate-and-Fire (LIF) Neuron Mode-LIF神经元模型-程序员宅基地

文章浏览阅读7.5k次,点赞10次,收藏45次。The Leaky Integrate-and-Fire (LIF) Neuron Mode基础知识_leaky integrate-and-fire

vscode_neovim(vim enhanced)配置与使用@通过变量$MYVIMRC来修改vim配置文件_vscode neovim-程序员宅基地

文章浏览阅读5.3k次。文章目录neovim官网用scoop 安装安装vscode extension配置方式1:配置方式2使得配置生效neovim官网这一部分独立于VScode进行安装(当然也可以独立于vscode进行使用)official introduction有三种方式安装它我以通用的而且简单的install from download方式安装(其实就是将官方压缩包解压一下即可)(我在windows下安装)用scoop 安装如果您的网络环境允许,scoop安装时不错的选择通过nvim可以在终端(p_vscode neovim

F. Fair Distribution——The 18th Zhejiang Provincial Collegiate Programming Contest_there are nn robots and mm energy bars in the drea-程序员宅基地

文章浏览阅读1.1k次。F. Fair Distributiontime limit per test1 secondmemory limit per test512 megabytesinputstandard inputoutputstandard outputThere are n robots and m energy bars in the Dream Kingdom. DreamGrid, the king, is trying to make a fair distribution of the energ_there are nn robots and mm energy bars in the dream kingdom. dreamgrid, the

Eclipse&STS相关介绍_eclipse&sts开发工具介绍-程序员宅基地

文章浏览阅读924次。不同版本Eclipse对JDK版本要求https://blog.csdn.net/kevin_pso/article/details/54971739?utm_source=blogxgwz7STS 下载及配置STS官网: https://spring.io/tools3/sts/all/STS历史版本: https://spring.io/tools3/sts/legacyST..._eclipse&sts开发工具介绍

PAT【L2-016】愿天下有情人都是失散多年的兄妹(dfs超详解)-程序员宅基地

文章浏览阅读480次,点赞3次,收藏3次。原题呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?输入格式:输入第一行给出一个正整数N(2 ≤ N ≤10^4​​ ),随后N行,每行按以下格式给出一个人的信息:本人ID 性别 父亲ID 母亲ID其中ID是5位数字,每人不同;性别M代表男性、F代表女性。如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1。接下来给出一个正整数K,随后K行,每行给出一对有

随便推点

《并发数据结构与多核编程》“并发”知识整理,复习笔记,建议收藏!-程序员宅基地

文章浏览阅读1.3k次,点赞6次,收藏14次。并发的思想和基本知识对于一个从程序员来说很重要,尤其是在当下的大数据、分布式、多处理器的时代。但是并发这门课学习起来可不轻松,这里整理我学习并发的知识,与大家分享~欢迎大家关注我的公众号DataFortune,文章包括但不限于人工智能、信号处理、python、图像处理。之后还会发布更多优秀博文,期待你的关注!文章目录第一讲 绪论第二讲 互斥算法第三讲 并发对象可线性化:第四讲 共享内存基础第五讲 共识协议和同步操作原语第六讲 空转锁和争用第七讲 管程和阻塞同步第八讲 链表第九讲 并发队列和并发栈第._并发数据结构与多核编程

masm5安装教程_masm5 1、下载个masm5.0(简单 联合开发网 - pudn.com-程序员宅基地

文章浏览阅读887次。masm5所属分类:汇编语言开发工具:DOS文件大小:524KB下载次数:10上传日期:2010-11-16 13:20:33上 传 者:叶丹丹说明:1、下载个masm5.0(简单,适合初学者),里面至少应包含masm.exe和link.exe,可能还包含其他的,不过我们只需要最基本的这两个。2、将masm5.0压缩包里的程序解压(包含masm.exe和link.exe),放到一个目录中(如D..._masm.5.0下载

解决LINK : fatal error LNK1140: 用于程序数据库的模块太多;链接时使用 /PDB:NONE 的错误_fatal error lnk1140: 用于程序数据库的模块太多;链接时使用 /pdb:none-程序员宅基地

文章浏览阅读8.2k次。某些不需要调试的工程 设置pdb:nonevs链接库文件数量有上限 右键工程->属性->链接器->调试->生成程序数据库文件 选择继承父类就好了_fatal error lnk1140: 用于程序数据库的模块太多;链接时使用 /pdb:none

面试官问你:你有什么想问的,你这么回答会给你加分_面试中面试官问你你想问我点什么-程序员宅基地

文章浏览阅读4k次。如果面试官问你:你有什么想问的?这通常表示面试到了尾声,但这并不是面试就要结束的标志,而是面试官给你扔过来的一个坑,如果这个问题回答好,就可以为面试加分,如果回答的不好,则同样会减分。那么,你提什么样的问题最好呢?提关于工作岗位、公司情况的问题工作不仅是谋生,也是对自己和用人单位的一种承诺。应聘人员这样问,表明自己想通过仔细了解工作内容和公司环境,审慎地考虑这份工作是不是适合自己。如果应聘..._面试中面试官问你你想问我点什么

QT 操作 sqlite数据库(二)----问题与其解决方案_sqlite no such function: concat-程序员宅基地

文章浏览阅读6.1k次。上一节从网络上找了一个一般的示例给大家,下面将逐步修改代码将其变为常规开发中可用的可复用代码。首先说下上面的代码在本人实际使用过程中遇到的问题及如何结果1、创建程序后提示“QSqlDatabase: No such file or directory” 的错误2、大部_sqlite no such function: concat

HTML列表项目结点:HTMLCollection和NodeList-程序员宅基地

文章浏览阅读251次。HTMLCollection是元素集合(元素顺序为文档流中的顺序),它和NodeList很像,有length属性来表示HTMLCollection对象的长度,可以通过 item() 传入数字索引来访问单个元素(也可通过方括号[ ]的方式)。当时它还有一个 nameItem() 方法,可以返回集合中指定 name 属性值 或 id 属性值的元素。HTMLCollection是即时更新的,当其所包含的..._html [object nodelist]

推荐文章

热门文章

相关标签