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浅谈的更多相关文章

  1. [C#]6.0新特性浅谈

    原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...

  2. Android v2.0 基本概念 - 浅谈

    目录 Android框架 Linux Kernel 系统运行库 Libraries Android Runtime Application Framework Application Android框 ...

  3. Spring 学习教程(一):浅谈对Spring IOC以及DI的理解

    一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...

  4. [转帖]浅谈IOC--说清楚IOC是什么

    浅谈IOC--说清楚IOC是什么 Need Study https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1. ...

  5. 浅谈.Net Core中使用Autofac替换自带的DI容器

    为什么叫 浅谈 呢?就是字面上的意思,讲得比较浅,又不是不能用(这样是不对的)!!! Aufofac大家都不陌生了,说是.Net生态下最优秀的IOC框架那是一点都过分.用的人多了,使用教程也十分丰富, ...

  6. Spring5.0源码学习系列之浅谈BeanFactory创建

    Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...

  7. Spring5.0源码学习系列之浅谈循环依赖问题

    前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文浅谈Spring循环依赖问题,这是一个面试比较常见的问题 1.什么是循环依赖? 所谓的循环依 ...

  8. 浅谈Android Studio3.0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

  9. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

随机推荐

  1. mui Picker DtPicker 固定内容以及变动内容Picker 不同情况下的应用 提高效率

    目的是: 保证不同的Picker只创建一次,多次创建Picker系统不会自己销毁,X掉一个之后后面可能会出现下一个. 保证实现需求的情况下,优化代码,提高效率. 1.如果picker中的内容为定值 v ...

  2. Java基础系列 - 抽象类继承和接口实现

    package com.inter; /** * 继承和接口的关系,单继承,多接口 * java不支持多继承,但可通过接口实现多重继承 */ public class test2 { public s ...

  3. 走进JavaWeb技术世界10:从JavaBean讲到Spring

    Java 帝国之Java bean (上) 转自: 刘欣 码农翻身 2016-05-27 前言: 最近看到到spring 的bean 配置, 突然想到可能很多人不一定知道这个叫bean的东西的来龙去脉 ...

  4. Java 多线程编程(锁优化)

    转:https://mp.weixin.qq.com/s/lDuguEhuWiLY8ofBRy3tZA 并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问. 加锁会带来性 ...

  5. TripleDES加解密Java、C#、php

    TripleDES说明:     TripleDES(3Des)和Des都是对称加密算法,TripleDes是Des加密算法的增强版本,这里主要说的是TripleDes加密算法的应用.     工作中 ...

  6. Redis客户端多线程跟多个连接不是一回事

    先抱怨一波,大国庆节的放假前一天的下班前15分钟,通知让我加班,因为一个Redis的bug,而这个bug我在1个半小时之前刚听说了个大概,心里很不情愿: 好了,说正事: 问题现象: bug是这样的,两 ...

  7. Sentinel控制台前端开发环境搭建

    Sentinel:分布式系统的流量防卫兵. 官网:https://sentinelguard.io Github:https://github.com/alibaba/sentinel Wiki:ht ...

  8. 总结解决 Android-Studio 编译耗时(好久、太长)问题

    首先通过搜索有关Android-Studio 编译耗时(好久.太长)问题的博客,速度确实有所改善. 一.暂时解决 Android-Studio 编译耗时(好久.太长)问题 本文链接:https://b ...

  9. angular父组件通过@ViewChild 主动获取子组 件的数据和方法

    1.调用子组件给子组件定义一个名称 <app-footer #footerChild></app-footer> 2. 引入 ViewChild import { Compon ...

  10. python mysql使用问题

    (deeplearning2) userdeMBP:ageAndGender user$ python Python |Anaconda, Inc.| ( , ::) [GCC Compatible ...