手把手教你写DI_0_DI是什么?

DI是什么?

Dependency Injection 常常简称为:DI。

它是实现控制反转(Inversion of Control – IoC)的一个模式。

fowler 大大大神 “几十年”前的经典文章 https://www.martinfowler.com/articles/injection.html 说的很清楚。

“几十年”以来,相信大家都早已学会了 大大大神 的教典。

我们简单回忆一下对应内容,以便我们可以顺利进入后续章节:徒手撸个小DI。

文章内容大致是这样:

首先举例:

640?wx_fmt=png

然后大大大神吐槽了一堆:

这个实现类的名字就说明:我将要从一个逗号分隔的文本文件中获得影片列表。你不必操心具体的实现细节,只要设想这样一个实现类就可以了。如果这个类只由我自己使用,一切都没问题。但是,如果我的朋友叹服于这个精彩的功能,也想使用我的程序,那又会怎么样呢?如果他们也把影片清单保存在一个逗号分隔的文本文件中,并且也把这个文件命名为” movie1.txt “,那么一切还是没问题。如果他们只是给这个文件改改名,我也可以从一个配置文件获得文件名,这也很容易。但是,如果他们用完全不同的方式——例如SQL 数据库、XML 文件、web service,或者另一种格式的文本文件——来存储影片清单呢?在这种情况下,我们需要用另一个类来获取数据。由于已经定义了MovieFinder接口,我可以不用修改moviesDirectedBy方法。但是,我仍然需要通过某种途径获得合适的MovieFinder实现类的实例。

还有张依赖图

640?wx_fmt=png

MovieLister类既依赖于MovieFinder接口,也依赖于具体的实现类。我们当然希望MovieLister类只依赖于接口,但我们要如何获得一个MovieFinder子类的实例呢?

在Patterns of Enterprise Application Architecture一书中,我们把这种情况称为插件(plugin):MovieFinder的实现类不是在编译期连入程序之中的,因为我并不知道我的朋友会使用哪个实现类。我们希望MovieLister类能够与MovieFinder的任何实现类配合工作,并且允许在运行期插入具体的实现类,插入动作完全脱离我(原作者)的控制。这里的问题就是:如何设计这个连接过程,使MovieLister类在不知道实现类细节的前提下与其实例协同工作。

将这个例子推而广之,在一个真实的系统中,我们可能有数十个服务和组件。在任何时候,我们总可以对使用组件的情形加以抽象,通过接口与具体的组件交流(如果组件并没有设计一个接口,也可以通过适配器与之交流)。但是,如果我们希望以不同的方式部署这个系统,就需要用插件机制来处理服务之间的交互过程,这样我们才可能在不同的部署方案中使用不同的实现。所以,现在的核心问题就是:如何将这些插件组合成一个应用程序?这正是新生的轻量级容器所面临的主要问题,而它们解决这个问题的手段无一例外地是控制反转(Inversion of Control)模式。

学术一点就是说 避免类之间强耦合,我们需要用依赖注入等方式在运行时才建立依赖达到代码松耦合,从而使代码易为维护

戏言就是在说:

  1. 我们都是大忙人,请你作为一个类简单明了的说清楚 : 你这个类能干什么事? 不要让我们这些大忙人把你每件衣服一件一件看完了才知道你是木匠, 还是铁匠

  2. 我们都是大老板,我们财产不能全靠你一个,你不能干活或者你干不好活,我们做老板的人必须能找人换了你

所以上述代码中:

我(MovieLister)离不开了 你 (ColonDelimitedMovieFinder("movies1.txt")),

但是我们男人必须靠自己,至少表面没人看出我们之间的关系

只有从我们(MovieLister)身体里面没有了你,才能没人看出我们之间的关系

当我们开始干活的时候,我们再根据我们的私下关系协调好工作,男女搭配,好好干活。

说到这里, 各位要被面试的同学记好这些话, 不要被问到依赖注入帮我解决了什么事情的时候, 回一句 我们不用自己new 对象啦, 这样大家就不会看见面试官无语又懵逼的脸了。

依赖注入的几种形式

640?wx_fmt=png

这几种方式之间并没有性能或者什么特别的优势,主要是形式上的差异。

具体对比可以参考 http://insights.thoughtworkers.org/injection/

引用参考:

  • http://insights.thoughtworkers.org/injection/

  • https://www.martinfowler.com/articles/injection.html


原文地址: https://www.cnblogs.com/fs7744/p/9919559.html


 
 

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

dotNET跨平台
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手把手你手简单的IOC框架
RubinChu的博客
01-14 298
描述了笔者在手简易IOC框架的详细步骤
说说你对DI的理解
weixin_38094135的博客
08-16 2631
定义 见名知义 DI = Dependency Injection = 依赖注入。 见名知义,DI 就是把依赖项注入到对象中。 它是一种编程技巧。使用它,可以编出松散耦合的代码。 不过,这种解释比较口水话,不够专业。 专业定义 有一本关于DI的英文著作,书名就叫做《Dependency Injection》,书中涵盖了关于DI的所有内容,并且给出了一个关于DI的专业定义。这个专业定义是:DI 是...
W25Q6
DWei_GaGa
04-26 355
SPI接口补充:DUAL SPI的读速度是普通序列式闪存的2-3倍,DI和DO是双向的,称作DI0 DI1;DUAD SPI的读速度是普通序列式闪存的4-6倍;DI和DO是双向的,称作DI0 DI1,同时,/WP和/HOLD也变成输入输出管脚,称作DI2 DI3。1. 特点1) 容量:16Mbits2) 寻址方式:独立寻址,属于STM32外扩的存储器--独立于CPU寻址3) SPI设备:从设备...
spring学习之DI(依赖注入)构造和Set方式
小小雨伞的博客
03-05 148
构造方式 //在类中使用有参构造 private String name; public UserMapperImpl(String name) { this.name = name; } <bean id="userMapper" class="top.chenyp.mapper.impl.UserMapperImpl"> <constructor-arg name="name" value="name"/> </
DI的三种依赖注入方式和底层实现
m0_73878473的博客
12-05 534
DI的三种依赖注入方式和底层实现
222-手把手带你一个MiniSpring
05-06
【标题】"222-手把手带你一个MiniSpring" 在编程世界中,Spring框架是Java企业级应用开发的基石,它以其依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的核心特性,...
Angular学习手把手你学会Angular2源码见于本demo项目
08-10
这个"Angular学习手把手你学会Angular2源码见于本demo项目"的资源,显然是一个指导初学者逐步掌握Angular2(现在被称为Angular4或更高版本)的实践程。在这里,我们将深入探讨Angular的核心概念和关键特性。...
SpringMVC精品资源--手把手你整合最优雅SSM框架:SpringMVC + Spring + MyBatis.zip
最新发布
02-18
- **Spring** 是一个全面的企业级应用框架,提供依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问等多种功能。 - **DI(Dependency Injection)** 是Spring的核心特性,允许开发者通过外部配置来管理对象...
SpringMVC精品资源--手把手你整合最简洁的SSM框架:SpringMVC + Spring + MyBatis.zip
02-18
Spring框架是Java企业级应用开发的基石,它提供了许多关键功能,如依赖注入(DI)、面向切面编程(AOP)、事务管理等。依赖注入使得组件之间松耦合,增强了代码的可测试性。AOP则允许在不修改原有代码的情况下,插入...
IOC和DI
m0_45364328的博客
05-31 132
提示:文章完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录IOC(Inversion of Control):反转控制。DI(Dependency Injection):依赖注入。IOC容器在Spring中的实现ApplicationContext的主要实现类ConfigurableApplicationContextWebApplicationContext IOC(Inversion of Control):反转控制。 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容.
java编程中的di是什么_Baa框架中的依赖注入(DI)是个什么鬼?
weixin_39789101的博客
02-28 563
我最早接触的Go WEB框架是beego,很强大的一个框架,也是很多人的首选,就是因为太(bu)强(gou)大(ling)了(huo),后来尝试了Macaron(martini)。Macaron的设计是众多框架的主流思想,路由、中间件、HTTP上下文,然后自己实现了一些常用的中间件(PS. 有一些中间件代码来自beego)。Macaron的思想中,可以通过m.Map()注入任意类型,然后在Cont...
控制反转(IoC) 的理解
我的专栏
08-16 870
控制反转是一个常见的面向对象技术,它主要应用在框架中。如 GUI框架,Spring框架等,这些框架为设计特定的应用程序提供了一般性的步骤,框架把核心的控制流程集成于自身,仅仅把一些具体的实现任务交给用户(程序员即为框架的用户),正是由于这些框架的产生才有必要用到控制反转技术。 也就是说,如果GUI框架仅仅被一个人使用,那么完全不用控制反转也行,因为此框架仅为一个人使用,这个人使用的类是什么样子的,
spring学习第一篇:控制反转(IOC)或依赖注入(DI)和面向切面编程(AOP)
热门推荐
迷路北极的鱼
07-29 1万+
spring相关的书和博文看了很多,一直也没明白依赖注入和面向切面编程到底是什么,spring企业实战看到第三遍突然恍然大悟,也许是因为之前动手过代码,所以终于潜移默化,慢慢理解了吧。 http://www.360doc.com/content/18/0125/09/27831725_724899826.shtml这篇文章得挺好的 首先控制反转和面向切面编程是spring的核心机制,由于控...
技术大牛对于 IOC 和 DI 的解释,这才叫通俗易懂!
Mr.zhao
04-12 1255
  学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。 一、分享Iteye的开涛对Ioc的精彩讲解   首先要分享的是Iteye的开涛这位技术牛人对...
Dia0.97.1中文输入解决方法
sq8706的专栏
12-14 1268
在windows下使用dia0.97.1,会遇见无法使用中文输入法输入中文的故障, 其实,解决办法很简单 { 在【输入法】菜单里,选择【简单】 } 后,即可使用中文输入法 直接 输入中文 了。
IOC和DI到底是什么?
weixin_30839881的博客
02-13 683
  在学习Spring框架的时候,我们总是能见到IOC这个单词,也时常听到DI这个词,那么他们分别是什么意思呢?接下来就讲讲个人对于这两个概念的理解   一、IOC和DI概念   IOC(控制反转):全称为:InverseofControl。从字面上理解就是控制反转了,将对在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制...
java自动化_Java自动化开发指南
weixin_28894087的博客
02-12 3339
一、背景在Java web开发中,虽然Spring boot已经帮助我们简化了很多工作,但项目中庞杂的业务仍然需要自己去编较多的 entity,vo,Mapper,Service, Controller 代码等,那么我们有没有什么办法来简化这整个开发流程呢?二、工具选型在尝试了部分市场较为主流的自动化工具后,还是选择了diboot-devtools这个开发者工具 ,因为她:专门为springbo...
简述控制反转ioc_控制反转(IoC) 的理解
weixin_42302638的博客
01-15 447
控制反转是一个常见的面向对象技术,它主要应用在框架中。如GUI框架,Spring框架等,这些框架为设计特定的应用程序提供了一般性的步骤,框架把核心的控制流程集成于自身,仅仅把一些具体的实现任务交给用户(程序员即为框架的用户),正是由于这些框架的产生才有必要用到控制反转技术。也就是说,如果GUI框架仅仅被一个人使用,那么完全不用控制反转也行,因为此框架仅为一个人使用,这个人使用的类是什么样子的,...
手把手你搭建SSI(struts2+spring+ibatis)框架
这种框架组合提供了模型-视图-控制器(MVC)的结构,以及强大的依赖注入(DI)和面向切面编程(AOP)能力,便于管理和维护复杂的Java Web应用。在实际开发中,还应根据项目需求进一步完善配置,例如添加安全控制、...
写文章

热门文章

  • 试用GitHub Copilot一周后,我给你的建议是:不要使用它 84784
  • .NET指定图片地址下载并转换Base64字符串 68153
  • VS2022安装教程和使用说明来了 35433
  • 深夜福利, 小试linuxkit 35120
  • 【汇总】多种方法教你绕过 TPM 2.0 安装 Windows 11 操作系统 34024

最新评论

  • WPF 使用DrawingVisual绘制高性能曲线图

    tent01: 值得学习啊,多谢

  • 【.NET6+Modbus】Modbus TCP协议解析、仿真环境以及基于.NET实现基础通信

    疾风铸境: 有支持net5的Modbus.NET吗?

  • C# WPF 中使用 MahApps.Metro.IconPacks 提供的图标

    my time zone: 博主,可以分享一下那个控件软件的下载地址吗

  • .NET集成DeveloperSharp实现AOP(经典+扩充)

    桃か白白: 异步不可以用啊

  • .NET指定图片地址下载并转换Base64字符串

    学编程的小虎: 刷的呗

最新文章

  • 为什么SM2算法签名结果不是64字节?
  • ASP.NET Core 知识速递 - Day 8:每天进步一点
  • 告别繁琐,拥抱简洁:vue-office,Vue文件预览的终极解决方案
2024
10月 138篇
09月 223篇
08月 235篇
07月 242篇
06月 229篇
05月 226篇
04月 225篇
03月 236篇
02月 202篇
01月 215篇
2023年2393篇
2022年2225篇
2021年2426篇
2020年2280篇
2019年2042篇
2018年1044篇
2017年1012篇
2016年621篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家甘南广场玻璃钢雕塑安装玻璃钢大花篮雕塑山西玻璃钢西红柿雕塑定做陕西玻璃钢人物雕塑价格昆明大型玻璃钢雕塑订做价格佳木斯校园玻璃钢雕塑厂家溧阳商场开业美陈个旧市玻璃钢雕塑公司玉溪玻璃钢动物雕塑价格福州佛像玻璃钢雕塑济南商场美陈雕塑树脂玻璃钢雕塑的优点青浦区玻璃钢雕塑诚信企业周口制作玻璃钢雕塑厂报价单锦州景区玻璃钢雕塑生产厂家玻璃钢雕塑漆图片大全禹王台玻璃钢雕塑厂家邳州百货商场美陈玻璃钢雕塑执行标准洛阳玻璃钢浮雕雕塑制作价格株洲卡通人物玻璃钢雕塑设计玻璃钢家具雕塑生产厂家图木舒克玻璃钢雕塑厂家天津吉林玻璃钢雕塑动物雕塑玻璃钢价格广东树脂玻璃钢雕塑广州玻璃钢景观雕塑定制东莞玻璃钢人物雕塑厂家玻璃钢小牛雕塑无机玻璃钢雕塑壁纸香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化