Laravel (5.5.33) 加载过程---instance方法(二)
在bootstrap/app.php
/**
* 对于其中的instance register singleton 方法到时候单独拎出来说明
*
* 1.设置基础路径
* 2.使用instance 方法 绑定app 和Illuminate\Foundation\Application类的关系
* 3.使用instance 方法 绑定Container 和Illuminate\Foundation\Application类的关系
* 4.app变量中注册事件服务EventServiceProvider
* 5.app变量中注册日志服务LogServiceProvider
* 6.app变量中注册路由服务RoutingServiceProvider
* 7.别名的注册(vendor/laravel/framework/src/Illuminate/Foundation/Application.php文件中的 registerCoreContainerAliases 方法)
*/
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
实例化 vendor/laravel/framework/src/Illuminate/Foundation/Application.php类 该类的魔术方法
public function __construct($basePath = null)
{
/**
* 如果有传地址 设置基础路径 设置
* path $this->path()
* path.base $this->basePath()
* path.lang $this->langPath()
* path.config $this->configPath()
* path.public $this->publicPath()
* path.storage $this->storagePath()
* path.database $this->databasePath()
* path.resources $this->resourcePath()
* path.bootstrap $this->bootstrapPath()
*/
if ($basePath) {
$this->setBasePath($basePath);
} /**
* 注册 app 和container到 instances数组中
*/
$this->registerBaseBindings(); /**
* 注册EventServiceProvider LogServiceProvider RoutingServiceProvider
*/
$this->registerBaseServiceProviders(); /**
* 设置核心类的别名
*/
$this->registerCoreContainerAliases();
}
查看注册 app 和container到 instances数组中
protected function registerBaseBindings()
{
static::setInstance($this); /**
* 由于初始化中 app没有添加到instances数组中 所以 不会执行build函数 只做了 instances数组中记录了app和$this
*/
$this->instance('app', $this); /**
* 由于初始化中 Container没有添加到instances数组中 所以 不会执行build函数 只做了 instances数组中记录了app和$this
*/
$this->instance(Container::class, $this);
}
查看今天主要的方法 instance
流程图

public function instance($abstract, $instance)
{ /**
* 如果aliases 数组总存在 则游离abstractAliases 数组 删除其中的存在的值
*/
$this->removeAbstractAlias($abstract); /**
* 判断 在bindings aliases instances其中有一个存现 则返回true
*/
$isBound = $this->bound($abstract); /**
* 删除别名数组中对于的建
*/
unset($this->aliases[$abstract]); // We'll check to determine if this type has been bound before, and if it has
// we will fire the rebound callbacks registered with the container and it
// can be updated with consuming classes that have gotten resolved here.
/**
* 在instances 数组中添加对于的建
*/
$this->instances[$abstract] = $instance; /**
* 如果之前存在实例化 则运行
*/
if ($isBound) {
$this->rebound($abstract);
}
}
第一个方法 removeAbstractAlias
/**
* Remove an alias from the contextual binding alias cache.
*
* @param string $searched
* @return void
*/
protected function removeAbstractAlias($searched)
{
/**
* 如果在别名数组中不存在则直接返回
*/
if (! isset($this->aliases[$searched])) {
return;
} /**
* 游离抽象别名 吧存在抽象类别名数组中的存在的删除
* @example abstractAliases = ['nameabstract'=>['aliase1','aliases2']]
*/
foreach ($this->abstractAliases as $abstract => $aliases) {
foreach ($aliases as $index => $alias) {
if ($alias == $searched) {
unset($this->abstractAliases[$abstract][$index]);
}
}
}
}
第二个方法: bound
/**
* Determine if the given abstract type has been bound.
*
* @param string $abstract
* @return bool
*/
public function bound($abstract)
{
return isset($this->bindings[$abstract]) ||
isset($this->instances[$abstract]) ||
$this->isAlias($abstract);
}
第三个方法: rebound
/**
* Fire the "rebound" callbacks for the given abstract type.
*
* @param string $abstract
* @return void
*/
protected function rebound($abstract)
{
/**
* 主要实现的功能为 build 方法 实例化制定的类 并且返回该类
*/
$instance = $this->make($abstract); /**
* 查看reboundCallbacks 数组中是否存在该别名创建完成之后需要调用的方法数组
* 存在返回需要调用的方法数组 并且逐个执行
*/
foreach ($this->getReboundCallbacks($abstract) as $callback) {
call_user_func($callback, $this, $instance);
}
}
Laravel (5.5.33) 加载过程---instance方法(二)的更多相关文章
- Laravel (5.5.33) 加载过程---make方法(四)
/** * Resolve the given type from the container. * * @param string $abstract * @return mixed */ publ ...
- Laravel (5.5.33) 加载过程(一)
说明: 由于公司项目使用Laravel 框架 也是第一次接触此框架 作为一个新手 记录使用过程的一些事情 以及对于框架源码分析的记录 整理自己的思路 也希望对大家有帮助 如果那里不对的地方 ...
- Laravel (5.5.33) 加载过程(二)
本次说明代码 /* |-------------------------------------------------------------------------- | Turn On The ...
- Spring IOC bean加载过程
首先我们不要在学习Spring的开始产生畏难情绪.Spring没有臆想的那么高深,相反,它帮我们再项目开发中制定项目框架,简化项目开发.它的主要功能是将项目开发中繁琐的过程流程化,模式化,使用户仅在固 ...
- mybatis的sqlSessionFactory的加载过程
使用过SSM的框架的都知道mybatis这个持久层框架,今天小编就来简单说说这个框架的核心工厂类sqlSessionFactory的加载过程,一般的SSM框架我们都会在spring的applicati ...
- Dubbo源码分析之ExtensionLoader加载过程解析
ExtensionLoader加载机制阅读: Dubbo的类加载机制是模仿jdk的spi加载机制: Jdk的SPI扩展加载机制:约定是当服务的提供者每增加一个接口的实现类时,需要在jar包的META ...
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...
- Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...
- Dubbo源码解析之SPI(一):扩展类的加载过程
Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...
随机推荐
- 用 Deployment 运行应用 - 每天5分钟玩转 Docker 容器技术(123)
从本章开始,我们将通过实践深入学习 Kubernetes 的各种特性.作为容器编排引擎,最重要也是最基本的功能当然是运行容器化应用,这就是本章的内容. Deployment 前面我们已经了解到,Kub ...
- Winform 控件的入门级使用(一)
开始总结一下控件的基本用法,方便以后查阅. 一.Label Label 的使用频率很高,基本上也没有什么难度. #region Winform //label label.Text = "这 ...
- Android简介(一)
Android构架 Android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用架构层.系统运行库层和Linux核心层. 1. ...
- Spark算子--groupByKey
转载请标明出处http://www.cnblogs.com/haozhengfei/p/0e90fe79f9f2e4b91a5d8e659ee68eaf.html groupByKey--Transf ...
- dedecms幻灯片调用图片模糊的解决办法
dedecms幻灯片调用的是缩略图,如果图片尺寸比例和幻灯片的大小相差太大的话,图片就会自动拉伸模糊,比较影响美观和用户体验,下面就有常用的2个方法来解决这个图片模糊的问题. 第一种:手动制图 我们用 ...
- 刚装上最新node,npm install报这个错误!求ndoe大神解答!!!
npm -v和node-v都可以打印出来但是 npm install就报错! 解决方法:网络问题,建议使用cnpm install命令安装npm,再运行npm run dev 命令
- SQL Constraints
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束. http://www.w3school.com.cn/sql/sql_unique.asp 另外相关:@On ...
- Asp.net Core 跨域配置
一般情况WebApi都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is present on the requested ...
- 【视频编解码·学习笔记】3. H.264视频编解码工程JM的下载与编解码
一.下载JM工程: JM是H.264标准制定团队所认可的官方参考软件.网址如下 http://iphome.hhi.de/suehring/tml/ 从页面中可找到相应的工程源码,本次选择JM 8.6 ...
- 安利一个神器:Tmux
对于程序员来说,一个好用且高效的软件工具就如同加持了神技的游戏角色.下面就给大家介绍一个神器 Tmux 以及个人的使用总结. 一.我所认识的 Tmux 在工作中,我把 tmux 当作终端会话管理器来使 ...