IoC/DI 解耦合及实现原理
IoC/DI解耦合及实现原理
一、知识拓扑
二、相关概念说明
-
控制反转:谁控制谁?控制什么?为何叫反转(对应于正向)?哪些方面反转了?为何需要反转?
|-- 谁控制谁?–》 IoC/DI容器控制应程序
|-- 控制什么? --》 ①IoC/DI同时控制对象本身的创建和实例化;②IoC/DI容器控制对象之间的依赖关系
|-- 哪些方面反转了? --》 ①创建对象;②程序获取资源的方式
|-- 为何需要反转? --》 ①引入IoC/DI容器过后,体系更为松散,而且管理更有序; ②类之间真正体现了松散耦合 -
依赖:什么是依赖(按名称理解、按动词理解)?谁依赖于谁?为什么需要依赖?依赖什么东西?
|-- 什么是依赖(按名称理解、按动词理解)? --》 依赖(按名称理解):依赖关系;依赖(按动词理解):依赖的动作
|-- 谁依赖于谁? --》 应用程序依赖于IoC/DI容器
|-- 为什么需要依赖? --》 因为发生了反转,应用程序依赖的资源都是IoC/DI 容器里面的
|-- 依赖什么东西? --》 因为程序依赖于IoC/DI 容器,依赖IoC/DI 容器为它注入所需要的资源。(比如:依赖关系) -
注入:谁注入于谁?注入什么东西?为何要注入?
|-- 谁注入于谁? --》 IoC/DI容器注入于应用程序
|-- 注入什么东西? --》 注入应用程序需要的外部资源,比如依赖关系
|-- 为何要注入? --》 因为程序要正常运行需要这些外部资源 -
依赖注入和控制反转是同一概念吗?
不是同一概念。其实它们两个描述的是同一件事件,但是是从不同的角度来说:控制反转是从IoC/DI容器的角度;依赖注入是从应用程序的角度
|-- 控制反转的描述:IoC/DI容器反过来控制应用程序,控制应用程序所需要的外部资源
|-- 依赖注入的描述:应用程序依赖IoC/DI容器。依赖它注入所需要的外部资源 -
参与者有哪些?
|-- IoC/DI 容器、应用程序 -
IoC/DI是什么?能做什么?怎么做?用在什么地方?
|-- IoC/DI是什么?
||-- IoC(Inversion of Control) :就是使用IoC/DI 容器反过来控制应用程序所需要的外部资源,是程序开发思想。
||-- DI(Dependency Injection) :就是应用程序依赖 IoC/DI容器来注入所需要的外部资源,也就是程序的开发思想。
|-- 能做什么:松散耦合对象
|-- 怎么做:使用Spring框架,里面有实现好了的IoC/DI容器
|-- 用在什么地方:凡是程序里面需要使用外部资源的情况,都可以考虑使用IoC/DI 容器 -
什么是外部资源?
对于一个类来说,所谓的外部资源,就是指在自己类的内部不能得到或实现的东西,不如说:在类里面需要读取一个配置文件,呢么这个配置文件就相当于这个类的外部资源。又比如:A类里面需要调用B 类,呢么对于A 类来说B 类就是外部资源 -
IoC容器
|-- 简单的理解就是:实现IoC 思想,并提供对象创建、对象装配以及生命周期管理的软件就是IoC容器
|-- 对IoC 的理解:
||-- 应用程序无需主动new 对象,而是描述对象应该如何创建
||-- 应用程序不需要主动装配对象之间的依赖关系,而是描述需要哪个服务,IoC 容器会帮你装配, 被动接受装配
||-- 主动变被动,是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则 -
使用IoC/DI 容器开发需要改变思路
|-- 应用程序不主动创建对象,但是要描述创建它们的方式
||-- 以后开发中只要看到有new 操作,就应该考虑使用IoC 容器
||-- 以上的针对成员变量 不是局部变量
|-- 在应用程序代码中不直接进行服务的装配,但是要描述哪一个组件需要哪一项服务,由容器负责将这些装配在一起。也就是说:所有的组件都是被动的,组件初始化和专供都是由容器负责,应用程序只是在获取相应组件后,实现应用的功能即可。
三、IoC 和DI 使用的底层技术
- xml 配置文件
- dom4j解析xl
- 工厂设计模式
- 反射
- 注解
四、最终目的
程序的高内聚,低耦合