依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)
DIP,IoC与DI概念解析
依赖倒置
DIP(Dependency Inversion Principle)
DIP的两大原则:
1、高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。
具体来讲,依赖倒置的核心思想是针对接口而不是实现编程。
应用DIP可以降低模块之间的耦合度,只要接口保持稳定,模块可以独立演化而互不影响。
控制反转
IoC(Inversion of Control)
通常情况下,class A依赖于class B,或者应用DIP之后依赖于Interface B,那么在运行时,我们必须自行主动的去实例化Interface B接口的实现类实例,然后将其引用传递给Class A,在传统的编程模型下,我们经常这样干。这样耦合度仍然很高,我们必须知道所依赖的实现类的一些细节。
而IoC则是将实例化被依赖模块的责任交出去,不再主动去做依赖装配工作,这样我们就可以彻底的只针对接口编程,而无需关心具体的实现。
IoC容器成为一个系统的对象容器和粘合剂,它负责创建对象的实例,并按照它们声明的依赖关系把它们粘合起来共同工作。通过配置文件或注解的方法,IoC容器会自动的满足模块之间的依赖关系,而无需我们再主动去处理依赖关系,只要被动接受就可以了。
这种依赖关系的满足由主动实现到被动接受的转变,就是所谓的控制反转了。
IoC与好莱坞原则(Don't call me,i'll call you!)比较相似。
依赖注入
DI(Dependency Injection)
依赖注入是实现控制反转的主要方式,另一种方式是依赖查找。
两者的区别在于,依赖注入是被动的接收对象,而依赖查找是主动索取响应名称的对象,获得依赖对象的时间也可以在代码中自由控制。依赖查找更加主动,在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态。比如使用JNDI来查找资源。
依赖注入有以下几种实现方式:
1、接口注入或叫Type 1型注入。需要实现特定接口以供外部容器注入所依赖类型的对象。这里有一个写的比较好的例子。这种注入方式很少用到。
2、setter注入或叫Type 2型注入。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。这种注入方式是最常见的。
3、构造函数注入或叫Type 3型注入。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。
4、注解注入。基于Java的注解功能,在私有变量前加“@Autowired”等注解,不需要显式的定义以上三种代码,便可以让外部容器传入对应的对象。该方案相当于定义了public的set方法,但是因为没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(因为set方法只想让容器访问来注入而并不希望其他依赖此类的对象访问)。注解注入是比较好的注入实现方式。
总的来讲,依赖倒置(DIP)是一种设计原则,控制反转(IoC)是一种处理对象间依赖关系的方式,与传统的主动方式正好相反,而依赖注入(DI)则是IoC容器实现控制反转的主要方式。
依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)相关推荐
- 依赖倒置、控制反转、依赖注入
实现依赖倒置.控制反转.依赖注入的核心思想是:接口驱动 接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性,实现模块之间的解耦等等. 参考资料:https://www.cnblogs ...
- 架构设计之依赖倒置、控制反转与依赖注入
名词解释 依赖:一种模型元素之间的关系的描述.例如类A调用了类B,那么我们说类A依赖于类B. 耦合:一种模型元素之间的关系的描述.例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系. ...
- 控制反转IOC与依赖注入DI
为什么80%的码农都做不了架构师?>>> 1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最 ...
- java-12:spring MVC - 控制反转IOC,依赖注入DI
学习spring框架之前,先理解几个概念: 1.第一部分:依赖倒置原则 2.第二部分:控制反转,控制反转容器(实例) 3.第三部分:控制反转,控制反转容器(全面理解,面试题) 综合性理解:控制反转(I ...
- 控制反转(Ioc)和依赖注入(DI)
控制反转IOC, 全称 "Inversion of Control".依赖注入DI, 全称 "Dependency Injection". 面向的问题:软件开发 ...
- 控制反转(IoC)与依赖注入(DI)详解
文章目录 什么是控制反转(IoC) 控制反转(IoC)有什么作用 控制反转(IoC)是怎么分类的 依赖注入 接口注入 Setter方法注入 构造器注入 依赖查找 上下文依赖查找(Contextuali ...
- 控制反转IOC、依赖注入DI的详细说明与举例
文章目录 引入 IOC介绍 IOC的实现 通过构造函数注入依赖 通过 setter 设值方法注入依赖 依赖注入容器 IOC优缺点 优点 缺点 阅读时忽略语言差异,参考了很多其他博主内容,参考博文在最后 ...
- Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...
- 控制反转 IOC 与依赖注入 DI
引言 简单总结和巩固一下spring的核心原理--IOC和DI的概念,为什么IOC要叫控制反转?IOC和DI的关系是怎样的? 一.IOC 控制反转 初学者可能很好奇,为什么spring framewo ...
最新文章
- C++——创建类的时候用new与不用new 的区别(转)
- Excel随机选取指定数据
- android消息池,回转寿司你一定吃过!——Android消息机制(构造)
- awk对某个字段分割处理
- DateChooser ASP.NET 2.0版 之实用版
- 九章算法班L3 Dynamic Programming Ⅰ
- 02.analyzer-tokenizer
- Intellij IDEA 新建一个EJB工程(三)
- SpringBoot整合Shiro实现登录认证和授权CHCache
- 杜克大学教授:提高学术写作水平的10条建议!
- python 散点图 分类_Python | 分类图
- Oracle PL/SQL开发基础(第十五弹:同义词)
- python 日本 地图 热力图_python 在百度地图上画热力图
- Problem D 牛栏(aggr)
- jfreechart-x轴刻度倾斜45度
- 树莓派源码安装glib
- 铁甲小宝像车轮的是什么机器人_铁甲小宝里所有机器人的名字和绝招
- Pyhton3 下载Telegram 频道数据
- 记一次带宽跑满服务器卡死事故处理
- 腾讯云点播服务端API
热门文章
- 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )
- 【设计模式】代理模式 ( 动态代理 )
- 【错误记录】应用运行 CPU 占用率达到 90% ( 使用 CPU Profiler 监控应用运行情况 )
- 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门示例
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...
- selenium-webdriver(python) (十六) --unittest 框架
- map/set/object/array对比
- KB2533623 下载
- [Android]动态加载/热部署框架汇总
- win32 去掉窗口边框