laravel(源码笔记)服务绑定和解析(依赖注入-反射,控制反转)

  • 依赖注入:解决对象之间的互相依赖关系,通过反射实现。
  • 控制反转:让外部来定义具体行为
  1. 反射(基本使用)
  • reflectionClass
    • getConstructor()
    • getParameters()
    • getConstants()
    • getProperties()
    • getMethods()
    • newInstanceArgs()
  • laravel依赖注入:通过反射获取构造器的参数,循环获取参数的名
    • 是否有依赖
      • 有依赖
        • 判断参数是否可选,可选则,获取可选参数的默认值进行解析。
        • 不可选则,通过注册 provider 注册闭包到控制反转容器(IOC)中,返回类的实例,最后通过make来解析对象
      • 没有依赖
        • 直接make解析类的对象
  1. 服务容器-控制反转
  • instance 已存在的对象(new过)
  • bind
    • 绑定自身 null
    • 绑定闭包 closure
      • new
      • 需要依赖注入的类
    • 接口和实现
  • singleton 单例
  • alias 给类设置别名,调用时$this->app->make('alias')
  • 服务解析过程:
    • make的实现原理
      • 获取别名,通过别名获取真实类名,
      • 通过instance方式绑定的,在实例中则返回,不存在则获取真实实例进行build返回。
      • 是否可build
        • 可以被build的
          • build后返回
        • 不可以被build的
          • 把实例放入make迭代,比如是接口方式,则需要把接口的实现放进去再执行一次make来build接口的实现类
      • 循环额外的拓展
      • 是否是共享池里面的,不是的话,放进去。下次直接可获取到。
      • 通知类被解析的闭包,执行闭包回调
      • 设置该类已经被解析。
    • build 的实现原理
      • 闭包,直接执行返回
      • 通过反射来对实现类进行反向工程
      • 不能被实例化抛出错误
      • 设置实例进入构造堆栈中
      • 获取构造函数
      • 构造函数为空,直接实例类返回,构造堆栈出栈
      • 获取构造函数依赖,生成构造函数依赖键值对作为参数执行获取依赖实例。
        • 获取依赖
        • 循环查找
          • 是否已经在参数中
            • 不存在
              • 是否有依赖,没有则入栈依赖数组
              • 有依赖,解析依赖对象,从新调用make,直至解决所有依赖。最后返回依赖,入栈到依赖数组中。(重点)
            • 存在,直接入栈到依赖数组
      • 构造堆栈出栈
      • 返回参数的实例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专家解读!IMAP的要点助您在旅途中保持邮件无忧!

你是否经常因会议而出差,需要在各种设备上灵活地访问你的电子邮件?如果是的话,你可能会想了解你的电子邮件系统是如何通过使用互联网消息访问协议(IMAP)来工作的,这样当你不在办公桌前时,你可以…

_.debounce防抖函数 在vue中使用this问题,应该传匿名函数而不是箭头函数

简单理解:_.debounce内部做了apply操作,箭头函数由于没有this,无法绑定this,导致最终this是undefined, 而匿名函数,成功通过applay绑定了this,所以this指向了vue组件实例。 methods: {// 防抖动dSave1: _.debounce(() > {console.log(thi…

用汇编进行字符串匹配

用汇编进行字符串匹配 2、试编写一程序,要求比较两个字符串 STRING1 和 STRING2 所含字符是否完全相同,若相同则显示 MATCH,若不相同则显示 NO MATCH。 .model small .dataSTRING1 db hello world!,0STRING2 db hello china!,0matchString d…

你知道弧幕影院如何制作吗?其应用领域竟如此广泛!

“沉浸式”作为如今备受热议的内容展示形式,其有着多种可实现的途径,其中弧幕影院作为一项有着独特视觉效果、沉浸式观影体验的技术类型,便是大多数影院、主题公园等娱乐场景的必备设计展项,这种弧幕影院通常使用大型的半圆形屏幕…

React-创建虚拟Dom四种方法

1.声明div const Son1<div>我言秋日胜春招</div> 2.声明函数 function Son() {return <div>自古逢秋多寂寥</div>;} 3.createElement方法 说明&#xff1a;React.createElement: 这是 React 提供的用于创建元素的函数。它接受三个参数&#xff1a…

python 爬取杭州小区挂牌均价

下载chrome驱动 通过chrome浏览器的 设置-帮助-关于Google Chrome 查看你所使用的Chrome版本 驱动可以从这两个地方找: 【推荐】https://storage.googleapis.com/chrome-for-testing-publichttp://npm.taobao.org/mirrors/chromedriver import zipfile import os import r…

leetcode 232.用栈实现队列 JAVA

题目 思路 使用两个栈&#xff08;输入栈和输出栈&#xff09;来模拟一个队列。 队列的push操作实现&#xff1a;直接将元素push到输入栈中。 队列的pop操作实现&#xff1a;队列是先入先出&#xff0c;将输入栈的元素全部pop到输出栈中&#xff0c;然后再由输出栈pop&#…

PMP备考时间、出成绩时间有多久?从在威班培训到拿证我用了60天

尽管PMI官方没有对PMP考试通过分数进行具体规定&#xff0c;能否通过也是看成绩页显示的是“PASS”&#xff08;通过&#xff09;还是“FAIL”&#xff08;未通过&#xff09;&#xff0c;没有成绩的数值体现&#xff0c;但有每个领域的等级可以进行查看&#xff0c;比如下图。…

并网型风光储微电网日前优化调度(MATLAB实现)

考虑了光伏发电、风力发电、电池储能和负荷需求等因素&#xff0c;与主网相连不考虑向主网售电情况。 % 微电网日前优化调度示例代码% 定义时间步长&#xff08;例如&#xff0c;每小时&#xff09; time_steps 24;% 生成模拟数据&#xff1a;光伏发电量&#xff0c;风力发电…

Windows系统服务器宝塔面板打开提示Internal Server Error错误

1、cmd运行bt命令 2、尝试输入16修复程序 3、如果不行&#xff0c;输入17升级程序

STL —— string(1)

目录 1. 模板 1.1 泛型编程 1.2 函数模板 1.2.1 函数模板概念 1.2.2 函数模板格式 1.2.3 函数模板的原理 1.2.4 显式实例化 1.2.5 模板参数的匹配原则 1.3 类模板 1.3.1 类模板定义格式 1.3.2 类模板的实例化 2. STL —— string类 2.1 STL 简介 2.2 标准库中的s…

微服务篇-C 深入理解第一代微服务(SpringCloud)_IV 深入理解Hystrix断路器

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 Part 1 理论部分 1 什么是微服务系统中的高可用&#xff1f; 在复杂的大型微服务系统中&#xff0c;高可用相关的技术方案非常重要&#x…

怎样隐藏查询和分组?

发布查询时&#xff0c;遇到信息量较大需要提前制作好&#xff0c;但不用马上发布的查询&#xff0c;该怎样隐藏查询和分组&#xff1f; &#x1f4cc;使用教程 01“开始”和“暂停”查询 如果想要隐藏查询&#xff0c;可以通过点击绿色开始按钮来暂停查询&#xff0c;暂停后的…

C++多态实现原理深度解析

C多态实现原理深度解析 目录 C多态实现原理深度解析 一、引言&#xff1a;多态性的基本概念与重要性 二、虚函数表&#xff08;VTable&#xff09;与虚函数指针&#xff08;VPtr&#xff09; 三、动态绑定与静态绑定 四、纯虚函数与抽象基类 五、继承与多态的关系 六、多…

【软考高项】十五、信息系统工程之系统集成

1、集成基础 定义&#xff1a;通过硬件平台、网络通信平台、数据库平台、工具平台、应用软件平台将各类资源有机、高效地集成到一起&#xff0c;形成一个完整的工作台面 基本原则包括:开放性、结构化、先进性和主流化 2、网络集成 包括&#xff1a;传输子系统、交换子系统、…

调试西门子G120STO模式出现O.F1600等一系列报警

目录 一、现象描述 二、 解决经历 三、结果展示 四、总结 一、现象描述 在调试使用西门子G120的STO功能时&#xff0c;一直无法使用&#xff0c;变频器也一直在报警(RDY灯红灯快闪、SAFE灯黄灯快闪)。在博图上查询发现下面一系列的故障报警。 二、 解决经历 也查询了很多网…

Vue中的状态管理Vuex,基本使用

1.什么是Vuex? Vuex是专门为Vue.js设计的状态管理模式;特点:集中式存储和管理应用程序中所有组件状态,保证状态以一种可预测的方式发生变化。 1.1.什么是状态管理模式? 先看一个单向数据流的简单示意图 state:驱动应用的数据源 view:以声明方式将state映射到视图 actions:…

实施业务连续性方案

实施业务连续性方案&#xff0c;可以提高组织在面对突发事件和业务中断时的韧性和恢复能力&#xff0c;保障业务的持续运行和服务的可用性。请注意&#xff0c;具体的方案内容应根据组织的特点、业务需求和风险状况进行定制化。 一、目标与范围 确定业务连续性方案的目标&#…

导入GPG密钥的方法

在配置Docker时&#xff0c;发现Docker官方和阿里云导入gpg秘钥的方法不同&#xff0c;借此记录。 Docker官方 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg 优点: 安全性: 这种方法不会直接将密钥添加到APT的密…

SAP前台处理:物料主数据创建<MM01>之会计视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…