依赖注入学习笔记(二)深入浅出依赖注入
学习资料来源:https://learnku.com/articles/10928/deep-inflow-of-dependency-injection
1、什么是「组件」和「服务」
所谓的「依赖」就是指在实现某个功能模块时需要使用另外一个(或多个)「组件」或「服务」,那么这个所需的「组件」或「服务」将被称为「依赖」。
「组件」:它是可能被作者无法控制的其它应用使用,但使用者不能对其源码进行修改的一个功能模块。
「服务」指:使用者以同步(或异步)请求远程接口来远程使用的一个功能接口。
「组件」和「服务」的 共同之处:就是它们都将被其他应用程序或功能模块使用。
它们的不同之处在于:
- 「组件」是在本地使用(如 jar 文件、dll 或者源码导入)
- 「服务」是在远程使用(如 WebService、消息系统、RPC 或者 Socket)
2、什么是控制反转和依赖注入?
控制反转定义:
「控制反转」提供了将「插件」组合进模块的能力。 在实现「控制反转」过程中我们「反转」了哪方面的「控制」呢?其实这里的「反转」的意义就是 如何去定位「插件」的具体实现。
采用「控制反转」模式时,我们通过一个组装模块,将「插件」的具体实现「注入」到模块中就可以了。
个人理解:
这有点像实现类的多态,组件的多态么?
依赖注入的目标:
「依赖注入」就是为了完成这样的 目标:将 依赖组件 的配置和使用分离开,以降低使用者与依赖之间的耦合度。
依赖注入的定义:
应用程序对需要使用的依赖「插件」在编译(编码)阶段仅依赖于接口的定义,到运行阶段由一个独立的组装模块(容器)完成对实现类的实例化工作,
并将其「注射」到应用程序中称之为「依赖注入」。
个人理解:
这感觉是面向接口开发???定义好接口,只要注入的依赖组件依赖该接口便可以实现注入。
3、什么是依赖注入容器
上面实现依赖注入的过程仅仅可以当做一个演示,真实的项目中肯定没有这样使用的。那么我们在项目中该如何去实现依赖注入呢?
看到上面这句话。老子信了你的邪。我好像就是这样做的。
定义:
由一个独立的组装模块(容器)完成对实现类的实例化工作,那么这个组装模块就是「依赖注入容器」。 <?php class Container { public function getStorage() { return new SessionStorage(); } public function getUser() { $user = new User($this->getStorage()); return $user; } } //调用 $container = new Container(); $user = $container->getUser();
思考:如何将实现类相关数据写入到配置文件中,并在容器中实例化从配置文件中读取。
个人理解:可以利用框架的服务器容器,使用自己创建的组件,这时候就要去看框架的服务器容器的使用,和创建组件规则了。学习学习。
4、依赖注入的优缺点
选择通过构造函数注入:
- 能够在构造阶段就创建完整、合法的对象;
- 带有参数的构造子可以明确地告诉你如何创建一个合法的对象;
- 可以隐藏任何不可变的字段。
选择通过 setter 设值方法注入:
- 如果依赖的「插件」太多时,选择设值注入更优
个人理解:
很高大上,只求会使用,想要设计可能要有成熟的框架思想。