当前位置: 首页 > news >正文

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,直至解决所有依赖。最后返回依赖,入栈到依赖数组中。(重点)
            • 存在,直接入栈到依赖数组
      • 构造堆栈出栈
      • 返回参数的实例

相关文章:

  • 【DFS+贪心】第十四届蓝桥杯省赛C++ B组《飞机降落》(C++)
  • wordpress给指定ID分类添加特定的字段
  • 【skimage包如何安装】
  • CentOS7使用Docker部署.net Webapi
  • python云上水果超市的设计与实现flask-django-php-nodejs
  • C/C++代码性能优化——数据结构和算法
  • 云手机为电商提供五大出海优势
  • 企业数字化转型:是竞争力的关键,还是行业炒作?
  • web自动化测试框架都是有哪些?
  • vim | 介绍vim以及配置vimrc文件
  • 【C语言】C语言运算符优先级详解
  • 汽车制造产生的污废水如何处理排放
  • 简述从浏览器发出请求到数据返回的全过程
  • 洛谷 1679.神奇的四次方数
  • Elasticsearch:ES|QL 入门 - Python Notebook
  • 【译】JS基础算法脚本:字符串结尾
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Akka系列(七):Actor持久化之Akka persistence
  • cookie和session
  • Github访问慢解决办法
  • Git初体验
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python - 闭包Closure
  • Travix是如何部署应用程序到Kubernetes上的
  • 分布式任务队列Celery
  • 将回调地狱按在地上摩擦的Promise
  • 开源SQL-on-Hadoop系统一览
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端攻城师
  • 如何选择开源的机器学习框架?
  • 原生js练习题---第五课
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • HanLP分词命名实体提取详解
  • # 安徽锐锋科技IDMS系统简介
  • #define,static,const,三种常量的区别
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (补)B+树一些思想
  • (十)T检验-第一部分
  • (转)可以带来幸福的一本书
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET CLR Hosting 简介
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET的数据绑定
  • .NET的微型Web框架 Nancy
  • .NET构架之我见
  • .NET开发者必备的11款免费工具
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [20170728]oracle保留字.txt
  • [C++基础]-初识模板
  • [Geek Challenge 2023] web题解
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [JavaWeb]—前端篇