如何理解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> 特定组件包 ...
随机推荐
- 数据库可视化工具分享 (DBeaver)
前提:最近公司下发通知,所有开发人员 必须 卸载 Navicat 数据库可视化工具,不知道兄弟们有没有在使用的,可能现在的反应跟我一样,一脸懵逼,Navicat为什么不能使用呢? 有事没事找度娘,于是 ...
- bugku web基础$_GET
让我们通过url传入what的值,让其等于flag 直接构造url就得到flag了
- go get 报错:dial tcp 142.251.43.17:443: i/o timeout
自动下载 go env -w GO111MODULE=on 设置环境为国内代理 go env -w GOPROXY=https://goproxy.cn,direct 注:go 版本需要支持 mod
- 06#Web 实战:实现可滑动的标签页
实现效果图 本随笔只是记录一下大概的实现思路,如果感兴趣的小伙伴可以通过代码和本随笔的说明去理解实现过程.我的 Gitee 和 GitHub 地址.注意哦:这个只是 PC 上的标签页,手机端的没用,因 ...
- Forest + IDEA = 双倍快乐!ForestX 隆重登场
Forest + IDEA = 双倍快乐!ForestX 隆重登场 Forest 是一款声明式的 Java 开源 HTTP 框架,相比它的前辈 Httpclient 和 OkHttp 更简明易懂.也更 ...
- 10-排序6 Sort with Swap(0, i) (25point(s))
10-排序6 Sort with Swap(0, i) (25point(s)) Given any permutation of the numbers {0, 1, 2,..., N−1}, it ...
- centos7安装MySql8.0.29教程
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying @ 目录 1 安装之前检测系统是否有自带的MySQ ...
- Python函数/动态参数/关键字参数
1.函数 #函数语法: #函数名规范:小谢字母开头,不同字母下划线隔开(字母数字下划线) #def 函数名(): #函数体:希望函数做的事情 1.1.无参函数 #无参函数 def music(): p ...
- 运维、监控、AIOps的几个重要观点
监控是整个运维乃至整个产品生命周期中最重要的一环,通过配置合理的告警机制,采集准确的监控指标,来提前或者尽早发现问题,解决问题,进而保证产品的稳定,提升用户的体验.『分布式实验室』特约记者艾尔斯兰(下 ...
- TortoiseGit (小乌龟安装配置及使用)
TortoiseGit 使用教程 (图文详解) 第一步 下载Git:下载地址:https://gitforwindows.org 第二步 下载TortoiseGit 以及 汉化包 (安装教程这里就不详 ...