如何理解Spring框架中的ioc?
如何理解Spring框架中的ioc?
ioc,Inversion of Control(控制反转),是Spring中的一种设计思想而非技术。
我们可以从4个方面理解ioc:
①谁控制谁? ——Ioc容器控制对象。
②控制了什么? ——Ioc容器控制了获取对象及其外部资源。
③为什么是反转? ——传统的javaSE技术是手动new对象的,通过new的对象直接控制资源的(相当于“正转”);而spring是使用Ioc容器创建对象并获取外部资源,相当于通过第三方查询获取(相当于“反转”)。即:传统技术是主动创建对象,而ioc思想是被动接受依赖对象。
④怎么实现反转的?——通过依赖注入(DI)的方式实现反转(这里的反转即:获取对象的方式)。
DI
DI,Dependency Injection(依赖注入),是将容器动态地注解到应用程序中。
简单地说,DI是通过注解的方式获取到对象以及一些外部资源。
DI和ioc其实是一个东西,只是理解的层面不同。通俗地说,ioc层面理解就是:获取对象的方式不再是我们主动创建寻找,而是多了个‘中介’去帮我们查询对象并寻找。DI层面理解就是:写代码的时候,要用到某个对象及资源,我们不再需要去查询那个对象在哪里,并且new对象,我们只需要配置好就可以直接通过@
获取我们需要的资源。
耦合和内聚
值得一提的是,ioc思想由于通过第三方ioc容器创建对象,能够减少代码的耦合性,从而使得代码更优。
看到这里也许有些人开始蒙了,为啥低耦合代码更优?这样一句话你或许听过:“我们写代码都要尽量向低耦合高内聚靠近!”这说明,低耦合高内聚的代码更好,你只需要知道这一点就够了。至于它们的理解,请继续往下看:
耦合和内聚都是评判软件程序优劣的一个标准。
理解耦合:
耦合指的是元素与元素之间的连接关系、依赖程度等。
举个例子,在类1引用类2的变量,我们需要new 类2的对象,这个时候类1和类2产生了一种依赖性:假如类2发生了改变或者消失,类1就会出现问题(报错)。类1与类2的这种关系,就是一种耦合,因为它们之间有一种依赖性。
上述只有两个类作比较,看不出什么,但是如果很多个类之间相互引用(也就是“高耦合”),创建其他类的对象,如果其中一些类做了修改或其他什么,想象一下,会报多少错?查询起来会多麻烦?工作效率是不是大打折扣了?
所以,低耦合的代码会更优。
有的人可能会问,那为什么ioc思想相对传统JavaSE技术就是低耦合的?
ioc思想是通过Ioc容器创建对象,相当于通过第三方查询对象并获取外部资源,是没有直接建立联系的,因此也就不存在高耦合的问题,注解之后资源就自动引入了。
理解内聚:
内聚通常指的是功能内聚,即程序之间的共同性。
用一句俗语解释:术业有专攻。各行各业,只需要管属于他们行业范围内的事情就可以了。内聚也是这个意思。
举个例子,我要写一个心理测试系统,那么主要功能就是心理测试。我写的所有代码如果都是心理测试核心代码,那么就是100%内聚,也就是超高内聚了,当然只是举个例子便于理解哈。
高内聚就是要我们写的代码尽可能相关,也就是所有程序尽可能围绕某个具体的功能点,这样程序更具体,也更便于管理。
上述是参考其他文献自行总结的,若有不合理的地方,恳请斧正,谢谢!
参考文献:
【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3
最新文章
- Util应用程序框架公共操作类(六):验证扩展
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 免费领取百度云盘2048G永久空间,永久离线下载特权
- WinZip Registry Optimizer 初体验
- confluence5.6安装
- json跨域原理及解决方法
- Day04_JAVA语言基础第四天
- 254. Factor Combinations
- POJ 3185	The Water Bowls (高斯消元 求最小步数)
- jQuery Asynchronous
- HTML表单元素
- JSP标准标签库(JSTL)--函数标签库 fn
- Notification弹出实现
- Spring Boot Document Part II(下)
- PAT1002:A+B for Polynomials
- php原生代码实现explode函数功能
- Requests+正则表达式爬取猫眼电影
- odoo开发环境搭建(三):安装odoo依赖的python包
- 多线程--Java
- 【设计模式最终总结】桥接模式 VS 外观模式
热门文章
- shell文件报错syntax error near unexpected token '$'\r''
- Windows自带管理工具
- 一文详解GaussDB(DWS) 的并发管控和内存管控
- 关于linux更改root用户下面的鼠标样式
- Oracle12c异常关闭后启动PDBORCL(ORA-01033)
- React Server Component: 混合式渲染
- day33-JSON&;Ajax01
- Flaks框架(g对象,session,数据库连接池,信号,flask-script,SQLAlchemy(ORM))
- 网络工具netstat与ss
- context状态树