手撸php框架6.0--构建DI容器之简介
2018-02-02 09:34
239 查看
依赖注入的核心功能就是将所依赖单元的实例化,放到类的外面进行。
例如:
在此例中,类A就依赖于B类,B类的实例化是在类A的内部实现的,这样A和B的耦合度过高。所以需要将类B的实例化移动到外部实现,然后注入到类的内部。
注入的方式分为两种:构造方法注入和属性注入
1.构造方法注入。
我们改造下类A
在实例化类A时,我们传入一个类B的实例化,赋值给属性object.这样run方法运行时直接调用属性object的方法即可。object对象可以在实例化过程中更改。
2.属性注入
属性注入可以在A实例化后,也可以随时改变属性object所持有的对象,这样就更加灵活了。
现在,我们提供一个Container对象,它可以在你索取某一个类的实例时,自动创建并返回一个实例。
联系之前的关于注入的知识,属性注入是在类实例化之后的事,而我们的Container要解决的是如何实例化一个类的事,所以它只需要关注构造注入中的依赖就可以了。
要实现一个Container对象,需要具备以下功能。
属性:
1.defineMap 存放注册的依赖关系
2.paramsMap 存放注册时提供的参数
3.dependencyMap 存放类构造函数的依赖关系
4.reflectionMap 存放类的放射实例
5.singletonMap 存放类的单例对象
方法:
1.注册依赖关系的方法
2.创建类的方法
3.其中创建类必须解析构造方法中的依赖,所以要有一个解析构造方法依赖的方法
4.解析了构造方法依赖,还必须有解决这个依赖的方法
5.注册依赖关系时,不仅有类,还会传递回调函数,已实例化的对象等;我们也需要对这些进行支持,所以会有一个统一的返回索要实例的方法其中不仅包含创建类,还包含调用回调函数等。
ok,今儿个先到这,欲知后事如何,且听下回分解……
github源码:https://github.com/2lovecode/tank
例如:
interface C { public function aaa(); } class B implements C { public function aaa() {} } class A { public function run() { $object = new B(); $object->aaa(); } }
在此例中,类A就依赖于B类,B类的实例化是在类A的内部实现的,这样A和B的耦合度过高。所以需要将类B的实例化移动到外部实现,然后注入到类的内部。
注入的方式分为两种:构造方法注入和属性注入
1.构造方法注入。
我们改造下类A
class A { public $object; public function __construct($object) { $this->object = $object; } public function run() { $this->object->aaa(); } }
在实例化类A时,我们传入一个类B的实例化,赋值给属性object.这样run方法运行时直接调用属性object的方法即可。object对象可以在实例化过程中更改。
2.属性注入
class A { public $object; public funciton setObject($object) { $this->object = $object; } public function run() { $this->object->aaa(); } }
属性注入可以在A实例化后,也可以随时改变属性object所持有的对象,这样就更加灵活了。
现在,我们提供一个Container对象,它可以在你索取某一个类的实例时,自动创建并返回一个实例。
联系之前的关于注入的知识,属性注入是在类实例化之后的事,而我们的Container要解决的是如何实例化一个类的事,所以它只需要关注构造注入中的依赖就可以了。
要实现一个Container对象,需要具备以下功能。
属性:
1.defineMap 存放注册的依赖关系
2.paramsMap 存放注册时提供的参数
3.dependencyMap 存放类构造函数的依赖关系
4.reflectionMap 存放类的放射实例
5.singletonMap 存放类的单例对象
方法:
1.注册依赖关系的方法
2.创建类的方法
3.其中创建类必须解析构造方法中的依赖,所以要有一个解析构造方法依赖的方法
4.解析了构造方法依赖,还必须有解决这个依赖的方法
5.注册依赖关系时,不仅有类,还会传递回调函数,已实例化的对象等;我们也需要对这些进行支持,所以会有一个统一的返回索要实例的方法其中不仅包含创建类,还包含调用回调函数等。
ok,今儿个先到这,欲知后事如何,且听下回分解……
github源码:https://github.com/2lovecode/tank
相关文章推荐
- 手撸php框架6.1--构建DI容器之实现
- 手撸php框架4.1--构建BaseObject之简介
- 手撸php框架7.0--构建服务定位器之简介
- 构建Apache Tomcat 6.0 Servlet/JSP 容器
- 手撸php框架5.0--构建Component之简介
- Spring核心容器的详细解析以及IOC和DI和过程全解
- Spring 控制反转(IoC)容器与依赖注入(DI)
- 通过laravel理解IoC(控制反转)容器和DI(依赖注入)
- 手撸php框架7.1--构建服务定位器之实现
- 构建springmvc+mybatis+dubbo分布式平台-dubbo简介
- 图文详解 IntelliJ IDEA 15 创建 Maven 构建的 Java Web 项目(使用 Jetty 容器)
- 构建工具-Gradle简介-1
- 深入理解DIP、IoC、DI以及IoC容器
- 使用Azure构建“鹰眼”容器平台
- 构建快速开发web项目的php框架 完成楼盘微信小程序后台
- 现代软件构建系统的使用 CMake简介
- Java并发包中CopyOnWrite容器相关类简介
- 【项目管理和构建】——Maven简介(一)
- 深入理解DIP、IoC、DI以及IoC容器
- Docker容器构建过程的安全性分析