理解Spring IOC概念及如何降低代码耦合度

很多八股文需要更深入去详细了解其思想,才不会记得那么累那么枯燥。本想查资料总结一篇关于IOC容器解耦的思想,但是看到这篇文章感觉挺好的,就不需要重写了。

什么是IOC

IOC(Inversion of Control)控制反转,是Spring中一个重要的特性,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。那么控制什么的权利被反转了呢,我们知道在写代码的过程中,经常会出现两个对象之间出现依赖关系,当A对象依赖B对象时,我们通常在A对象中通过new的方式来创建它的依赖对象B,而控制反转之后,对于对象的创建权被托付给IOC容器了,也就是这些对象由容器来产生,而不是对象在需要的时候再去创建自己的依赖对象。

举例来理解IOC,一个家庭的组建需要夫妻两个,某种意义上,我们可以说两者之间存在依赖关系。传统方式就是,当我需要组建一个家庭时,我自己去找对象,自己去组建家庭,而IOC方式就是将找对象的权利委托给爸爸妈妈,当我出生时,爸爸妈妈就为我指腹为婚,为我找好了对象。

IOC如何降低了代码之间的耦合度

从传统方式到IOC一步步解耦

第一步转变 直接new对象————>面向接口编程

最开始我们创建一个对象是采取new对象的方式,但这样不可以实现多态,比如我创建一个person对象,里面有一个eat(Apple apple)方法,那么调用这个eat方法的类,需要传入苹果(Apple)对象,之后我的这个方法改成吃梨子了,这个方法又改成eat(Pear pear)了,调用eat方法的类,又需要把之前的苹果改成梨子,扩展性差,于是出现了面向接口编程,我在eat方法里面传入水果(Fruit)接口,之后苹果,梨只需要实现接口即可,调用eat方法的类,想吃梨子就传入梨子,想吃苹果传入苹果即可。

补充

其实就是想做到当我像改变new的对象或其中某个方法时不需要去修改代码,另外“封装”的思想:当内部接口类发生改变时不会影响外部类的调用。

第二步转变 面向接口编程————>工厂模式

面向接口编程后,解决接口和实体类之间的耦合。
在面向接口编程中我们常常会出现这样的代码UserDao userDao = new UserDaoImpl();假设现在不用这个UserDaoImpl了,而改用UserDao的另一个实现类UserDaoImpl2,UserDap userDao = new UserDaoImpl()需要改为UserDao userDao = new UserDaoImpl2(),这样也就是接口和实现类出现了耦合。

工厂模式如何去解决耦合问题呢——不让接口和实现类产生关系,而是找一个中间人,也就是工厂,实现类必须要从工厂中取出来。工厂的意思也就是一个批量制造同样规格(规格也就是接口类所提供好的规范)类的类。

class BeanFactory {public static UserDao getUserDao() {return new UserDaoImpl();}public static StudentDao getStudentDao() {return new StudentDaoImpl();}
}

UserDao userDao = new UserDaoImpl —> UserDao userDao = BeanFacotry.getUserDao();
StudentDao studentDao = new StudentDaoImpl ----> StudentDao studentDao = BeanFacotry.getStudentDao();
这样的话,如果userDao变成了需要UserDaoImpl1,studentDao变成了需要StudentDaoImpl1,我只需要去BeanFactory中改对应的getUserDao和getStudentDao方法即可。这样实际上就是从改多个类变成了改BeanFacotry一个方法,这样接口类和工厂类产生了耦合。

第三步转变 工厂模式————>工厂模式+反射+配置文件(IOC的底层实现)

为了能解决接口类和工厂类的耦合,是不是也就是要解决

public static UserDao getUserDao() {return new UserDaoImp();
}

这个方法中只能返回UserDaoImpl或者UserDaoImpl1的问题,我们希望他可以根据我们的需要返回需要的UserDaoImpl,如何解决?
配置xml文件——指定需要返回的UserDaoImpl

<bean id="userDao" class="**.UserDaoImpl">

工厂类

class BeanFactory {public static UserDao getUserDao(String id) {// String className = 解析配置文件xml 拿到id对应的class// 反射class clazz = class.forName(className);return clazz.newInstance();}
}

这样的话如果我们需要改UserDao的实现类的类型,我们可以直接在配置文件中修改,就不用改代码。

Spring中DI概念

DI:依赖注入,前提是必须要有IOC的环境,Spring管理这个类的时候将类依赖的属性注入进来我们在写代码的时候知道,对象和对象之间经常会存在依赖关系,当我们使用了IOC将对象的创建权交给spring之后,spring在创建对象的同时一定也要将对象相应的依赖同时创建好,否则创建的这个对象就是一个功能不完善的对象,那么依赖注入的这个过程就是它的另一个特性DI(依赖注入)。

SpringIOC是如何降低代码的耦合度的相关推荐

  1. java多态 降低代码耦合性_如何降低耦合度

    一.什么是耦合度 耦合度就是某模块(类)与其它模块(类)之间的关联.感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计及编码质量评价的一个标准.耦合的强度依赖于以下几个因素:(1)一个模块 ...

  2. 开发日记-20190417 关键词 代码之间耦合度的一刀两断 (思路篇)

    就目前而言,就我的理解,为什么要设计结构清晰的代码呢,因为结构清晰的代码往往耦合度很低,那为什么要降低代码之间的耦合度呢,当然是因为程序员是一种喜爱偷懒和害怕犯无意义错误的一种生物,那么该怎么办呢,无 ...

  3. 利用Java反射机制降低代码圈复杂度

    利用Java反射机制降低代码圈复杂度 在实际的工作中,我遇到了项目里老代码存在圈复杂度过高的问题,在提交代码的时候通不过CI(代码检查)的Lizard复杂度检查,所以迫切需要解决这个问题,运用Java ...

  4. 企业如何降低代码泄露的风险?

    武林中有一种笑傲江湖叫做身怀绝技,战争中有一种蔑视群雄叫做原子核武,然而安全领域有一种无坚不摧叫做github在手,哥啥都不会照样轻松搞穿你的内网- https://github.com/joyxee ...

  5. java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  6. 降低代码执行中得内存消耗_微服务中使用 OpenJ9 JVM内存占用降低60%!

    专注于Java领域优质技术,欢迎关注 作者: 陈一乐 来自:陈一乐 随着微服务的普及,许多企业踏上微服务之旅. 微服务化后,应用数量可能高一个数量级.一般企业,以前三五个应用能支撑业务,微服务化之后应 ...

  7. 如何降低代码圈复杂度

    已剪辑自: https://mp.weixin.qq.com/s?__biz=MzI2MTE4Nzk5MA%3D%3D&mid=2247483685&idx=1&sn=2607 ...

  8. 写过25W行代码,3个操作系统:我如何做架构设计,来降低代码复杂度?

    来源| 美团技术团队 作者| 政华,顺谱,陶鑫 导读:本文是作者阅读John Ousterhout的<A Philosophy of Software Design>之后,结合自己的工作经 ...

  9. spring-boot使用教程之三:如何使用sts中的热部署来降低代码开发量

    在eclipse的年代, 我们可以使用debug来运行项目,这样的话 只要不是更改类结构, 那我们打代码修改完毕之后都可以自动生效, 那现在在springboot中该如何实现热部署呢,其实非常的简单, ...

最新文章

  1. 好消息:Sci-Hub解封了!可以看2021新文献了!附可用网址
  2. 一部手机,万物皆可复制粘贴,将AR玩出了新高度
  3. python的优点-python的功能与优缺点
  4. 非常实用的 Python 库,推一次火一次
  5. HDFS的namenode和datanode
  6. JAVA 程序执行进行计时,用于验证程序执行的时间
  7. python代码导出_代码生成 – Python生成Python
  8. PHP stomp 连接判断,php实现通过stomp协议连接ActiveMQ操作示例
  9. HTML与XHTML区别
  10. python索引值_python索引总结
  11. 解锁用户及数据库表,锁死进程
  12. 有图形化显示,继承WebControl类
  13. [AGC007 E]Shik and Travel
  14. python编程入门-Python编程入门电子书教程,看这几个就够了
  15. Ubuntu16.04安装Mono4.2.1 C#开发环境
  16. 冲刺阶段—个人工作总结07
  17. 3说明书_BMW新3系说明书上没写的6条信息
  18. USB 2.0学习笔记1——硬件/Lenovo
  19. 工作 3 年和读研 3 年哪个更值?
  20. Spring的Bean生命周期

热门文章

  1. 如何用VGA接口乳法?
  2. 特征提取PCA实现及避坑指南
  3. 5G NR之SRS Resource Indicator(SRI)天线选择
  4. Ubuntu-Touch-04:使用Xshell搭配Xftp对手机进行基本配置
  5. 使用阿里巴巴提供的约束规范
  6. SU-03T语音模块烧录及mini开发板使用
  7. Android线程和线程池(二)HandlerThread学习记录 使用+源码
  8. 配电室综合监控系统的设计与应用
  9. 【IM苹果推iMessage】苹果真机推送自动分配任务,自动分配任务,让您瞄准中高端客户
  10. Django个人博客开发 | 前言