laravle6.0-IOC-DI浅谈
1.什么是IOC,DI
IOC(Inversion of Control)控制反转:ioc意味着,你将自己设计好的对象交给容器来控制,而不是传统的在你的对象内部直接控制。比如:
人 操控 手机 做一些事情;
手机 实现人工智能,手机自己可以做一些事情。
DI(Dependency Injection)依赖注入:di意味着,在程序运行的过程中,动态的向某个对象提供它所需要的其他对象(换句话说就是:将依赖的对象分离,当依赖的对象需要使用这些依赖关系的时候,依赖关系才会被建立)。比如:
异地恋的关系:当男孩和女孩想要在一起的时候,可以通过开车建立联系到一起,约会吃饭做一些事;没有建立联系的时候是彼此独立的。
解耦:IOC,DI一定程度解耦程序
拓展:AOP(Aspect Oriented Programming)面向切面编程:是OOP的延续,将系统中非核心的业务提取出来,单独处理。
2.IOC的本质是?
laravel6.0中 IOC的本质就是一个容器数组。如下:
$array = [
'app' => 'Application::class', //闭包
'标识'=>'类'
]
依赖注入:就是把新的标识 , 新的类 新增到容器中。
3.浅谈laravel6.0中原生的IOC
将定义的类注入到容器[数组]中,当需要用到该类时,让容器构造出一个自己需要的类的实例,返回具体容器构造出来的实例来使用。
依赖注入:在容器类中 调用闭包函数 传入类名,具体信息 new类的对象 保存在容器数组$bindings[]中。
控制反转:需要某个类的对象,传入类名[别名,参数] 解析获取到该类的具体实例。
4.浅谈laravel的核心类container
/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php
$bindings[] 容器数组:所有注入的类保存在该数组中
绑定类到容器数组
public function bind($abstract, $concrete = null, $shared = false)
{
$this->dropStaleInstances($abstract); //删除旧实例和别名(已经绑定的类)
// 没有具体的类型给出,则设置具体类型的抽象类型。
if (is_null($concrete)) {
$concrete = $abstract;
}
//如果不是闭包Closure,这意味着它仅仅是被绑定到这个容器抽象类型
if (! $concrete instanceof Closure) {
$concrete = $this->getClosure($abstract, $concrete);
}
$this->bindings[$abstract] = compact('concrete', 'shared'); //把一个抽象类注入到容器中
// 如果抽象类型是在该容器中已经解析,触发反弹侦测,获取回调解析的对象副本
if ($this->resolved($abstract)) {
$this->rebound($abstract);
}
}
获取绑定(注入)类时需要的闭包
protected function getClosure($abstract, $concrete)
{
//返回闭包函数解析的 实例
return function ($container, $parameters = []) use ($abstract, $concrete) {
//如果要注入的abstract concrete类型具体是抽象类 则回调注入$container->build($concrete);
if ($abstract == $concrete) {
return $container->build($concrete);
}
//解析容器中给定的类型
return $container->resolve(
$concrete, $parameters, $raiseEvents = false
);
};
}
解析容器中给定的类型
protected function resolve($abstract, $parameters = [], $raiseEvents = true)
{
$abstract = $this->getAlias($abstract); //获取一个可用的抽象类的别名 $needsContextualBuild = ! empty($parameters) || ! is_null(
$this->getContextualConcrete($abstract)//获取具体抽象内容
); //
if (isset($this->instances[$abstract]) && ! $needsContextualBuild) {
return $this->instances[$abstract];//共享实例
} $this->with[] = $parameters; //覆盖堆栈的参数 $concrete = $this->getConcrete($abstract); //获取给定抽象的具体类型 // 递归绑定注册具体的实例,以致于所有嵌套的依赖也被解析
if ($this->isBuildable($concrete, $abstract)) {
$object = $this->build($concrete);
} else {
$object = $this->make($concrete);
} // 获取给定类型扩展回调
foreach ($this->getExtenders($abstract) as $extender) {
$object = $extender($object, $this);
} // 共享实例
if ($this->isShared($abstract) && ! $needsContextualBuild) {
$this->instances[$abstract] = $object;
} if ($raiseEvents) {
$this->fireResolvingCallbacks($abstract, $object);
} // 返回之前设置标志为真
$this->resolved[$abstract] = true;
// 移除覆盖当前版本堆栈参数,$with[] 覆盖堆栈参数数组
array_pop($this->with);
// 返回完全构造的具体实例
return $object;
}
laravle6.0-IOC-DI浅谈的更多相关文章
- [C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...
- Android v2.0 基本概念 - 浅谈
目录 Android框架 Linux Kernel 系统运行库 Libraries Android Runtime Application Framework Application Android框 ...
- Spring 学习教程(一):浅谈对Spring IOC以及DI的理解
一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...
- [转帖]浅谈IOC--说清楚IOC是什么
浅谈IOC--说清楚IOC是什么 Need Study https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1. ...
- 浅谈.Net Core中使用Autofac替换自带的DI容器
为什么叫 浅谈 呢?就是字面上的意思,讲得比较浅,又不是不能用(这样是不对的)!!! Aufofac大家都不陌生了,说是.Net生态下最优秀的IOC框架那是一点都过分.用的人多了,使用教程也十分丰富, ...
- Spring5.0源码学习系列之浅谈BeanFactory创建
Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...
- Spring5.0源码学习系列之浅谈循环依赖问题
前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文浅谈Spring循环依赖问题,这是一个面试比较常见的问题 1.什么是循环依赖? 所谓的循环依 ...
- 浅谈Android Studio3.0更新之路(遇坑必入)
>可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...
- 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释
浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...
随机推荐
- 1、套按字及http基础知识之一
MAC地址:设备到设备之间通信时专用(从源主机到目标主机可能经由N台路由设备)4 IP地址:标记主机到主机之间通信时专用 TCP/UDP :提供进程地址 通过port number来标记 进程地址:用 ...
- 如何设置fvOptions【翻译】
翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-pre-processing/121763-how-set-fvoption ...
- BZOJ2716天使玩偶
不会KD-tree怎么办?CQD硬搞. 建立正常的平面直角坐标系,首先我们只考虑在目标点左下角的点对目标点的贡献,由于左下点的横纵坐标都小于目标点,那么曼哈顿距离就可以化简了,绝对值去掉后,得到$x2 ...
- Oracle的大表,小表与全表扫描
大小表区分按照数据量的大小区分: 通常对于小表,Oracle建议通过全表扫描进行数据访问,对于大表则应该通过索引以加快数据查询,当然如果查询要求返回表中大部分或者全部数据,那么全表扫描可能仍然是最好的 ...
- Python日志库logging总结-可能是目前为止将logging库总结的最好的一篇文章
在部署项目时,不可能直接将所有的信息都输出到控制台中,我们可以将这些信息记录到日志文件中,这样不仅方便我们查看程序运行时的情况,也可以在项目出现故障时根据运行时产生的日志快速定位问题出现的位置. 1. ...
- linux修改配置文件解决mysql中文乱码和指定数据库存储引擎
如题,mysql数据库的中文显示乱码: 先看下原来数据库里的字符编码: mysql> show variables like '%character_set%'; +-------------- ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_11-前端集成认证授权-身份校验
把下面赋值到nginx中 前端的服务需要配置一下 重启nginx 启动教学管理的前端 没有登陆直接就进来教学管理的后端了 下面我们要做的就是这两件事 1.前端页面校验用户的身份,如果用户没有登录则跳转 ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_03-用户认证-认证服务查询数据库-查询用户接口-接口定义
1.2.4 查询用户接口 完成用户中心根据账号查询用户信息接口功能. 在ucenter这个服务里面定义查询用户信息的接口 这个接口在auth的服务的loadUserByUserName这个方法里面被调 ...
- Arduino---ESP8266 WIFI模块
一:Arduino安装ESP8266 https://www.arduino.cn/thread-76029-1-1.html(内容截图如下:最简单方法) 选用NodeMCU .0即可 二:简单测试 ...
- 一百四十一:CMS系统之根据板块过滤显示帖子
视图,根据传过来的板块id查数据 @bp.route('/')def index(): board_id = request.args.get('board_id', type=int, defaul ...