热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

5分钟理解依赖注入和控制反转

基本的解释想必打开这篇文章的人,对依赖注入和控制反转都有了大致的概念。简单的说:控制反转是依赖注入的实现。举一个例子男人A要找女朋友,他可以去网聊、去夜店、去酒吧等等各种地方碰运气

基本的解释

想必打开这篇文章的人,对依赖注入和控制反转都有了大致的概念。简单的说:控制反转是依赖注入的实现。

举一个例子

男人A 要找女朋友,他可以去网聊、去夜店、去酒吧等等各种地方碰运气,花钱花时间。这是一种找女朋友的方法,也是很多人的做法。

男人B 要找女朋友,他年纪大了没有那么多时间和精力在这方面花费气力,直接去相亲。这是很多大龄青年找女朋友的方法,也就是今天想说的方法。

简单的说明

假设以上例子就是找女朋友,找到女朋友就OK。那么哪一个效率更高呢?显然是男人B。

对于男人B 来说,他的目标是找女朋友,他 依赖 相亲 注入 女朋友。这里的相亲可以理解成为一个服务,比如说婚恋网站,同事朋友的介绍,婚介所等等。

对于男人A 来说,他的所投入的时间和金钱等,可以拥有更高质量的女朋友。可能对这个女朋友了如指掌,能完全摸清楚她的脾气,以至于能够控制她。

但对于男人B 来说,想了解和控制这个女朋友就不好说了。因为一点都不了解,更别说控制了。换句话说:控制 这个女朋友的能力,完全 反转 了。

代码的解释

很多人不理解依赖注入和控制反转主要是不熟悉适用场景,其实在很多框架中我们说用到了 IoC 和 DI,实际上都是一回事,他实际上就是我们设计模式的一种:门面模式,也称外观模式。

实际上,在去理解 依赖注入控制反转 时,我们需要有两个概念。

  1. 我们需要做一件事;
  2. 项目中有提供做这件事的方法。

实际的代码

class Boy {
public function getGirlfriend() {
$site = new LoveSite();
$site->createGirl();
}
}
class LoveSite {
public function createGirl() {}
}
$boy = new Boy;
$boy->getGirlfriend();

以上代码是个例子,对于 Boy 来说, LoveSite 是他的一个依赖,只有在使用 Boy,并调用 getGirlfriend 方法的时候,才会被它注入,并创建一个 girl。

而控制反转在这个例子中的体现就是用单独的一个 LoveSite 类去实现 createGirl 的功能,而不是把这个函数的代码写在 Boy 类中。

以上。。。


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
  • 我尝试使用Vue.js在Laravel中实现imageupload吗?但是,我不知道为什么图像 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
author-avatar
mobiledu2502881211
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有