DI依赖注入/IOC控制反转
DI依赖注入#
啥都不说,直接上代码
<?php
class UserController
{
private $user;
function __construct(UserModel $user) {
$this->user = $user;
}
}
$user = new UserController(new UserMonel());
?>
User控制器依赖UserModel,实例化的时候,直接注入。
IOC控制反转#
先说IOC和DI的区别吧!
- IOC是一种设计思想
- DI是一种设计模式
所以两者有本质上的区别。DI是IOC的一种实现方法(还有ServiceLocator等其他设计模式)。 所谓的反转,主要指由 主动依赖 到 被动依赖 。
//主动依赖
function __construct() {
$this->user = new UserModel();
}
//被动依赖
function __construct(UserModel $user) {
$this->user = $user;
}
二.什么是IOC容器.#
IOC容器 是Laravel的核心设计模式,对于laravel的应用和理解是非常有必要深入学习的!
IOC思想实现了高度解耦,那么,问题来了,如何管理这些分散的模块呢?这就是容器的任务了!
可以想象成,在IOC容器中,装着(注册)很多模块。当用户需要一个模块的时候,可以从中拿出来。当提取的模块依赖另一个模块的时候,容器会自动注入,再返回给用户(反射机制实现)。
是不是碉堡了?大批互相依赖的模块被完美解耦并统一管理了!
三.什么是服务提供者(ServiceProvider).#
假设模块一多,那么容器不是越来越大?每次加载,岂不是加载好久? 能不能弄一条管子,连接着模块,插在容器上,需要再通过管道获取呢?这样子,容器只是装着管头而已,就不怕被撑大了!
这条管子就是 服务提供者。

服务提供者本身也是一个类,不过这个类只有启动和注册两个函数。
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//绑定到容器
$this->app->singleton(
'Riak\Contracts\Connection',
function ($app) {
return new Connection($app['config']['riak']);
}
);
}
服务提供者在config/app.php中配置,laravel自动注册到容器中。
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
...
/*
* Application Service Providers...
*/
app\Providers\AppServiceProvider::class,
app\Providers\AuthServiceProvider::class,
...
]
四.什么是门面(Facade).#
程序猿总是偷懒的,每次要模块,都要去容器里面拿,多麻烦啊!找个人代拿行不?这送货小哥就叫Facade门面。文档中叫静态代理。
送货小哥都是在config/app.php 中注册的。
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Config' => Illuminate\Support\Facades\Config::class,
'Cookie' => Illuminate\Support\Facades\Cookie::class,
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'DB' => Illuminate\Support\Facades\DB::class,
'Route' => Illuminate\Support\Facades\Route::class,
...
],
查看Illuminate\Support\Facades\Route代码,可以发现只有getAccessFacade()方法,这就是交代送啥货的函数,继承了Facade这个小哥基类。
class Route extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'router';
}
}
注册了Facade门面后,就可以在任意地方使用了!
文档有详细的使用方式 Laravel 架构 — Facades。
五.Application和Kernel#
不难发现,在引导程序开始初始化的时候,也就是在boostrap\app.php文件,里面一来就new了一个 Illuminate\Foundation\Application。下面分别注册了 Http\Kernel、Console\Kernel、Exceptions\Handler等。
这里可以这么理解,new一个Application,可以看作是创造了一个空间,这个空间初始化的时候,就会为自己注入一个容器,也就是在空间中放了一个容器。
在 Illuminate\Foundation\Application.php 中的 registerBaseBindings() 函数可以查看到容器注入源码。
至于kernel,可以看成是这个空间的工人,有各种各样的工人,每个工人都有自己的工作。好比HttpKernel,负责处理http请求以及控制整个请求流程。
DI依赖注入/IOC控制反转的更多相关文章
- 大话DI依赖注入+IOC控制反转(一) 之 定义
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转 依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...
- 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生 ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- 浅谈(IOC)依赖注入与控制反转(DI)
前言:参考了百度文献和https://www.cnblogs.com/liuqifeng/p/11077592.html以及http://www.cnblogs.com/leoo2sk/archive ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- 简单解析依赖注入(控制反转)在Spring中的应用
IoC——Inversion of Control 控制反转DI——Dependency Injection 依赖注入 大家都知道,依赖注入是Spring中非常重要的一种设计模式.可能很多初学者 ...
- 谈谈php依赖注入和控制反转
要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题: DI--Dependency Injection 依赖注入 IoC--Inversion of Control 控制反转 1. ...
- Java的依赖注入(控制反转)
两个主角"依赖注入"和"控制反转": 1.二都说的都是同一件事,只是叫法不同.是一个重要的面向对象编程的法则,也是一种设计模式: 2.英文原称:依赖注入,Dep ...
- .NET Core的依赖注入[1]: 控制反转
写在前面:我之前写过一系列关于.NET Core依赖注入的文章,由于.NET Core依赖注入框架的实现原理发生了很大的改变,加上我对包括IoC和DI这些理论层面的东西又有了一些新的理解,所以我在此基 ...
随机推荐
- 你应该在开始API开发之前知道的事(上)(翻译)
这篇文章的源地址:http://dev.dota2.com/showthread.php?t=58317 由于文章内容较多,英语水平有限,准备尝试着以中英混搭的形式翻译,免得曲解一些不懂内容的意思.以 ...
- 【BFS】POJ 3278
POJ 3278 Catch That Cow 题目:你要去抓一头牛,给出你所在的坐标和牛所在的坐标,移动方式有两种:要么前一步或者后一步,要么移动到现在所在坐标的两倍,两种方式都要花费一分钟,问你最 ...
- APP性能测试之卡顿比(FPS)
fps概念: FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数.FPS是测量用于保存.显示动态视频的信息数量.每秒钟帧数愈多,所显示的动作就会愈流畅. 卡顿人体感觉标准 ...
- windows下调试virtualbox的虚拟机串口
1.我不知道其他人是怎么实现的,我是这么实现的. 2.下载一个叫做VSPD的软件,其作用是在windosw上虚拟几个串口出来. 下载完了安装,安装完了注册,如果不是花钱买来的,那就自己想办法注册吧.我 ...
- React native 的弹出层(输入)效果
/*弹出层测试*/ import React,{Component} from 'react'; import { StyleSheet, View, Image, Text, TouchableOp ...
- mysql数据库安装及使用
前言:本文为在ubuntu系统下使用mysql数据库,mysql 版本为:Ver 14.14 Distrib 5.5.43 (mysql版本可在命令行中输入mysql --version显示) 一.m ...
- Struts2二级菜单联动
http://www.cnblogs.com/wujixing/p/5194461.html ps: Java面试 http://blog.csdn.net/zhang070809/article/d ...
- Android课程---关于数据存储的学习
activity_data1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- Quartz作业调度框架及时间表达式的含义和语法
Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.本 ...
- c语言中的副作用!!千万小心!
今天刚看完书上的副作用,博主觉得呢,副作用其实就在改变变量的值,也就是一个赋值操作!不过刚刚在知道上还是犯了错!!尴尬啊!! 大家都知道,c语言中的赋值操作符是自右向左结合的!! 下面有一个关于赋值中 ...