如何理解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
如何理解Spring框架中的ioc?的更多相关文章
- Spring框架中的IOC?
Spring中的org.springframework.beans包和org.SpringframeWork.context包构成了Spring框架IOC容器的基础.BeanFactory接口提供了一 ...
- Spring框架中的IOC和DI的区别
上次面试被问到IOC和DI的区别时,没怎么在意,昨天又被问到,感觉有点可惜.今晚总算抽点时间,查看了spring官方文档.发现,IoC更像是一种思想,DI是一种行为.为了降低程序的耦合度,利用spri ...
- 理解Spring框架中Bean的5个作用域
当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...
- 第四课:通过配置文件获取对象(Spring框架中的IOC和DI的底层就是基于这样的机制)
首先在D盘创建一个文件hero.txt,内容为:com.hero.Hero(此处必须是Hero的完整路径) 接下来是Hero类 package com.hero; public class Hero ...
- Spring框架中IoC(控制反转)的原理(转)
原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...
- Spring MVC -- Spring框架入门(IoC和DI)
Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...
- Castle框架中的IOC和AOP机制
反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...
- Spring框架中 配置c3p0连接池 完成对数据库的访问
开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...
- 细说shiro之五:在spring框架中集成shiro
官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...
- Spring框架学习之IOC(二)
Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...
随机推荐
- golang 简书
https://www.jianshu.com/p/548adff0d10d Go 入门指南 https://github.com/wuxiaoxiaoshen/go-example-for-live ...
- Excel表格复制填写
=if(A1<>"",A1,"") #A1可以为任意表格单元
- Python中 or、and 的优先级
上式可以看出 先看 and 输出才为 ture 因此 优先级 and>or
- winform datagridview行头添加序号
1.使用datagirdview的RowPostPaint事件 2.datagirdview命名为dgv.(当然这个名字随意,开心就好) 3.贴代码 private void dgv_RowPostP ...
- 关于python导包问题(新手向)
包和模块 首先要弄清这两个概念, 在python 中 一个文件夹中包含__init__.py 文件(这个文件是包的初始化文件,在你导入包或包下面的模块的时候,这个文件会最开始运行),就会被python ...
- linux系统编码修改
1. 查看当前系统默认采用的字符集locale 2. 查看系统当前编码echo $LANG如果输出为:en_US.UTF-8 英文zh_CN.UTF-8 中文 3. 查看系统是否安装中 ...
- 爬虫笔记之xpath
目录 xpath如何取包含多个class属性 xpath获取当前标签下的所有文本(包括子标签) xpath如何取包含多个class属性 如果HTML结构是这样 <div class=" ...
- Python异步爬虫(aiohttp版)
异步协程不太了解的话可以去看我上篇博客:https://www.cnblogs.com/Red-Sun/p/16934843.html PS:本博客是个人笔记分享,不需要扫码加群或必须关注什么的(如果 ...
- TypeError: Object(…) is not a function
vue中遇到的这个错误 1. 先检查变量名或者函数名是否有重复定义 报这错之后看了好久,也没有发现starkflow上说的,重复定义了变量或者函数 2. vue的话 检查下函数写的位置,直接写到cre ...
- npm设置
1.默认安装完node.js后会自己安装npm,通过npm下载全局模块默认安装到C:\Users\wangyc\AppData\Roaming目录下,主要有两个文件夹:npm.npm-cache 2. ...