laravel学习之IOC容器分析

在入口文件里可以看到

$app = require_once __DIR__.‘/../bootstrap/app.php‘;

$app这个是laravel的全局变量,在里面可以看到实例化了这个类

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.‘/../‘)
);

里面的构造函数做了4件事

1,注册基本的绑定,把当前类的对象绑定到app和Illuminate\Container\Container中

$this->registerBaseBindings();

2,注册服务提供器,里面注册了EventServiceProvider和RoutingServiceProvider,详细的没研究过,以后有机会在研究

$this->registerBaseServiceProviders()

3,注册别名

$this->registerCoreContainerAliases();

4,绑定一些项目内有可能用到的路径

if ($basePath) {
    $this->setBasePath($basePath);
}

接下来就一个一个的分析一下里面是用来做什么的

protected function registerBaseBindings()
    {
        static::setInstance($this);//获取当前类的实例,规定了要实现ContainerContract接口的类才可以实例化

        $this->instance(‘app‘, $this);

        $this->instance(‘Illuminate\Container\Container‘, $this);
    }

第一句

public static function setInstance(ContainerContract $container)
    {
        static::$instance = $container;
    }

就把当前类的对象赋值给当前类的$instance变量,方便以后调用

剩下的就是调用instance方法来绑定对象到容器了

看看laravel是怎么绑定对象到容器的

public function instance($abstract, $instance)
    {
        $abstract = $this->normalize($abstract);//如果是字符串,就把前面的斜线去掉
        if (is_array($abstract)) {
            list($abstract, $alias) = $this->extractAlias($abstract);

            $this->alias($abstract, $alias);
        }//如果是数组,例如$this->instance([‘app‘=>‘a‘],$this),就存进$this->aliases中,变成$this->aliases[‘app‘] = ‘a‘;没用过这个绑定方法,查看其他资料看到的

        unset($this->aliases[$abstract]);

        $bound = $this->bound($abstract);//返回一个布尔值,用于下面判断是否执行回调函数

        $this->instances[$abstract] = $instance;//这里就是把变量绑定到instance数组中,例如传进来的是($app,$this),所以绑定成$this->instance[‘app‘] = new a();a代表传进来的类

        if ($bound) {//如果为真,就调用$this->reboundCallback[]里有没有回调函数,有的话就调用
            $this->rebound($abstract);
        }
    }

  

未完....

  

  

时间: 2024-08-07 08:28:45

laravel学习之IOC容器分析的相关文章

Spring IOC容器分析(3) -- DefaultListableBeanFactory

上一节介绍了封装bean对象的BeanDefinition接口.从前面小结对BeanFactory的介绍中,我们知道bean对象是存储在map中,通过调用getBean方法可以得到bean对象.在接口BeanFactory中定义了多个相同签名的getBean方法,如下所示: Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) thro

Spring学习-2-Spring IOC容器

作用:创建对象 & 处理对象依赖关系 容器创建对象的方式 1)调用无参数构造器 <bean id="user" class="com.cx.createObj.User"></bean> 2)带参数构造器 <bean id="user" class="com.cx.createObj.User"> <constructor-arg index="0" typ

Spring学习之IOC容器1

在Spring IOC容器的设计中,有两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能:另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在.应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境做了许多适配. 用户在使用容器时,可以使用转义符“&”来得到FactoryBean本身,用来区分通过容器来获得FactoryBean产生的对象和获取FactoryBean本身.例如,如果MyBean是

[spring学习1] IoC容器

简介 一般java程序会有很多个类,类的声明赋值等都需要自己手动操作,比较繁琐.Bean是一个规范,它也是一个普通的java类,人们希望像写出的程序松耦合,每个类实现自己的功能即可,Bean就类似于一个一个的零件,程序由许多的Bean拼装而成. 很多类,我们常重复使用到,但初始化并赋值等操作都是重复的,在业务代码中还要想办法去找个地方去做它. 通过spring框架,配置好的bean,ioc容器会自动帮你new出来,并赋好值,自动管理bean的生命周期.我们仅仅只在需要使用的地方声明,ioc容器会

Laravel依赖注入(DI)和Ioc容器

原文地址:http://lixiangfeng.com/blog/article/content/7908531 Laravel这个框架,用起来方便,理解起来不简单. 为什么不简单?因为包含了一大堆所谓"先进"的概念,其中依赖注入(DI)和Ioc容器是比较核心的内容之一. 我百度了一下,讲PHP DI和Ioc的内容很少,更别说详解Laravel ioc的了. 在这里,我综合了几篇写得比较典型的文章,以一个产品经理的身份,从用户体验的角度尝试让初学者也能比较容易理解这个2个概念. DI和

laravel 学习笔记 —— 神奇的服务容器

转载自:https://www.insp.top/learn-laravel-container 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或者是提供对象的回调,通过这种容器,我们得以实现许多高级的功能,其中最常提到的,就是 “解耦” .“依赖注入(DI)”.本文就从这里开始. IoC 容器, laravel 的核心 Laravel 的核心就

好记性不如烂笔头83-spring3学习(4)-spring的BeanFactory(IoC容器)

我们一般把BeanFactory叫做IoC容器,叫ApplicationContext 为应用上下文(或者Spring容器) BeanFactory是spring框架的核心,实现依赖注入[使个组件的依赖关系从代码中独立出来,使用配置文件即可实现这种依赖关系]和bean声明周期的管理 . BeanFactory[IoC容器]启动过程:分为两个阶段,一个是容器启动阶段,另外一个是Bean实例化阶段 容器启动阶段:加载配置 -–> 分析配置信息 -–>装备到BeanDefinition -–>

[原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

spring技术内幕读书笔记之IoC容器的学习

第一篇:概念和设计原理 IoC容器的实现作为Spring的核心内容之一非常有必要拿来研究一下 1.概念 IoC(Inversion of Control,控制反转)必须思考的问题:哪些方面的控制被反转了? 对于这个问题,Martin Flower给出结论是:依赖对象的获得被反转了.基于此,他为控制反转创造了一个更好的名字:依赖注入. SpringIoC模块是这一思想的一种实现,IoC容器把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,降低了组件之间的耦合度,利于功能复用,方便进行