分为如下两部分:

  1. 依赖注入
  2. 容器

  1. 依赖注入

    1. 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入;

    2. 在控制器架构方法和操作和方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于 URL 请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。

    3. 案例:

      // 模型层 One
      namespace app\model;
      use think\Model;
      class One extends Model
      {
      public $username = 'laowen';
      } // 控制器
      namespace app\controller;
      use app\model\One;
      class TestOne
      {
      protected $one;
      public function __construct(One $one)
      {
      $this->one = $one;
      }
      public function index()
      {
      return $this->one->username;
      }
      }
    4. 依赖注入:即允许通过类的方法传递对象的能力,并且限制了对象的类型(约束);

    5. 而传递的对象背后的那个类被自动绑定并且实例化了,这就是依赖注入;

    6. 支持使用依赖注入的场景包括(但不限于):

      • 控制器架构方法;
      • 控制器操作方法;
      • 路由的闭包定义;
      • 事件类的执行方法;
      • 中间件的执行方法;
  2. 容器

    1. 依赖注入的类统一由容器管理的,大多数情况下是自动绑定和自动实例化的;

    2. 如果想手动来完成绑定和实例化,可以使用bind()和app()助手函数来实现;

      class TestTwo
      {
      public function bind()
      {
      bind('one', 'app\model\One');
      return app('one')->username;
      }
      }
      // bind('one' ,'...')绑定类库标识,这个标识具有唯一性,以便快速调用;
      // app('one') 快速调用,并自动实例化对象,标识严格保持一致包括大小写;
    3. 自动实例化对象的方式,是采用单例模式实现,如果想重新实例化一个对象,则:

      class TestTwo
      {
      public function bind()
      {
      bind('one', 'app\model\One');
      // 每次调用总是会重新实例化
      return app('one',[], true)->username; // app()中第二参数,方法实例化对象的时候,传递参数;
      // 模型层通过构造函数来接收数据
      // $one = app('one', [['test']], true);
      // return $one->username;
      }
      }
    4. 通过 app() 绑定一个类到容器中并自动实例化;

      class TestTwo
      {
      public function bind()
      {
      return app('app\model\One')->username;
      }
      }
    5. 批量绑定到容器中

      public function bind()
      {
      bind([
      'one' => 'app\model\One',
      'user' => 'app\model\User'
      ]); // bind([
      // 'one' => \app\model\One::class,
      // 'user' => \app\model\User::class
      // ]);
      // ::class 模式,不需要单引号;
      // 而是需要在最前面加上\,之前的加不加都行;
      return app('one')->username;
      }
    6. 系统提供了 provider.php 文件,用于批量绑定类到容器中;

    7. 系统内置了很多常用的类库,以便开发者快速调用;

ThinkPHP6.0 容器和依赖注入的更多相关文章

  1. .Net Core 3.0 内置依赖注入:举例

    原文:.Net Core 3.0 内置依赖注入:举例 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

  2. IOC容器的依赖注入

    1.依赖注入发生的时间 当Spring IoC容器完成了Bean定义资源的定位.载入和解析注册以后,IoC容器中已经管理类Bean定义的相关数据,但是此时IoC容器还没有对所管理的Bean进行依赖注入 ...

  3. springboot成神之——ioc容器(依赖注入)

    springboot成神之--ioc容器(依赖注入) spring的ioc功能 文件目录结构 lang Chinese English GreetingService MyRepository MyC ...

  4. 通过中看不中用的代码分析Ioc容器,依赖注入....

    /** * 通过生产拥有超能力的超人实例 来理解IOC容器 */ //超能力模组接口 interface SuperModuleInterface{ public function activate( ...

  5. spring框架--IOC容器,依赖注入

    思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action  多个   [维护成员变量] service 一个   [不需要维护公共变量] dao     一个   [不需要维护 ...

  6. AspectCore中的IoC容器和依赖注入

    IOC模式和依赖注入是近年来非常流行的一种模式,相信大家都不陌生了,在Asp.Net Core中提供了依赖注入作为内置的基础设施,如果仍不熟悉依赖注入的读者,可以看看由我们翻译的Asp.Net Cor ...

  7. 从celery rabbitmq with docker-compose 引出对容器、依赖注入、TDD的感悟

    用docker配置项目管理系统taiga的时候,不是我一个人遇到这个问题.https://github.com/douglasmiranda/docker-taiga/issues/5 问题描述: 用 ...

  8. ASP.NET Core 1.0基础之依赖注入

      来源https://docs.asp.net/en/latest/fundamentals/dependency-injection.html ASP.NET Core 1.0在设计上原生就支持和 ...

  9. Spring源码解析三:IOC容器的依赖注入

    一般情况下,依赖注入的过程是发生在用户第一次向容器索要Bean是触发的,而触发依赖注入的地方就是BeanFactory的getBean方法. 这里以DefaultListableBeanFactory ...

随机推荐

  1. Springboot以Jetty为容器实现http重定向到https

    1 简介 之前讲解的Springboot整合https用的是tomcat作为容器,tomcat也是一个流行多年的老牌Java容器了.但针对不同的场景,还是会有不同的选择,如Jetty.Jetty是架构 ...

  2. CTR学习笔记&代码实现4-深度ctr模型 NFM/AFM

    这一节我们总结FM另外两个远亲NFM,AFM.NFM和AFM都是针对Wide&Deep 中Deep部分的改造.上一章PNN用到了向量内积外积来提取特征交互信息,总共向量乘积就这几种,这不NFM ...

  3. 【Linux网络基础】 DNS:介绍、作用、解析原理

    1. DNS是什么?   DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去+·记住能够被机器直接读 ...

  4. python连接mysql数据表查询表获取数据导入到txt中

    import pymysql'''连接mysql数据表查询表获取数据导入到txt中'''#查询结果写入数据到txtdef get_loan_number(file_txt): connect = py ...

  5. 高可用性GRE+IPSEC中心—分支

    在实际网络运用中我们时常跑GRE+IPSEC来实现我们中心到分支的远程访问回话,这样以来容易配置,而来可用性高,我们知道L2L无论是链路备份还是设备备份,都不是状态备份,当一个点断掉后,用经过几十秒甚 ...

  6. 2019 ICPC 银川网络赛 H. Fight Against Monsters

    It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Eg ...

  7. turtle库应用实例2-六芒星的绘制

    六芒星的绘制 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪ ...

  8. Thinkphp 缓存RCE

     5.0.0<=ThinkPHP5<=5.0.10 .   漏洞利用条件: 1.基于tp5开发的代码中使用了Cache::set 进行缓存 2.在利用版本范围内 3.runtime目录可以 ...

  9. JavaScript键值对集合怎么使用

    JavaScript键值对集合怎么使用 我们可以对此键值对集合分为3种难度 1.简单的使用 var arr = { 'cn': "中国", 'usa': '美国', 'jp': ' ...

  10. struts2初始化探索(一)

    上篇文章已经介绍了struts2的简单使用,现在开始源码的学习. 本篇主要介绍struts2的初始化.对应的源码为StrutsPrepareAndExecuteFilter中的init方法. 先贴源码 ...