IoC控制反转与DI依赖注入
IoC控制反转与DI依赖注入
IoC: Inversion of Control
IoC是一种模式。目的是达到程序的复用。下面的两篇论文是对IoC的权威解释:
- InversionOfControl http://martinfowler.com/bliki/InversionOfControl.html
- Inversion of Control Containers and the Dependency Injection pattern http://martinfowler.com/articles/injection.html
一个对IoC形象化的描述,出自论文 http://www.digibarn.com/friends/curbow/star/XDEPaper.pdf 中的:
- Don‘t call us, we’ll call you (Hollywood’s Law).
- A tool should arrange for Tajo to notify it when
- the user wishes to communicate some event to
- the tool, rather than adopt an “ask the user for
- a command and execute it” model.
当用户(人、程序)要使用一个工具的时候,让框架来激活这个工具,而不是让用户执行一些命令来激活它。
即,原则是,使用组件的地方,只需要知道要使用什么样的组件,它会来自某个地方,但不需要知道组件具体是谁。
按照这个原则开发的系统,实现了各组件之间相互依赖的解耦。即替换某个组件,不需要修改使用这个组件的组件。
在编程语言实现上,IoC所涉及的工作主要有:
- 定义接口、虚类等规范约束。这是基础。
- 开发具体的实现规范的组件。
- 开发组件创建工厂。具体包括组件配置、组件创建等。
- 开发组件管理器。具体包括缓存组件对象、将组件交给需要它的对象等。
IoC有很多具体的实现模式:
(1)Dependency Injection (DI) 依赖注入
组件管理器将组件注入到使用组件的对象中。
- 构造函数方式注入。被注入的对象在构造器中传入。
- 设值方法注入。通过setter方法注入。
- 接口方法注入。需要被注入的类实现一个具体的接口,由一个注入器调用这个接口方法,完成组件注入。
- // Java示例:接口方法注入
- // 注入依赖的接口
- public interface InjectFinder {
- void injectFinder(MovieFinder finder);
- }
- // 注入依赖的接口
- public interface InjectFinderFilename {
- void injectFilename(String filename);
- }
- // 注入器接口
- public interface Injector {
- public void inject(Object target);
- }
- // ==
- // 仅为InjectFinder组件
- class MovieLister implements InjectFinder {
- public void injectFinder(MovieFinder finder) {
- this.finder = finder;
- }
- }
- // 既是InjectFinderFilename组件,又是InjectFinder接口的注入器
- class ColonMovieFinder implements Injector, InjectFinderFilename {
- public void injectFilename(String filename) {
- this.filename = filename;
- }
- public void inject(Object target) {
- ((InjectFinder) target).injectFinder(this);
- }
- }
- // 仅为InjectFinderFilename接口的注入器
- class FinderFilenameInjector implements Injector {
- public void inject(Object target) {
- ((InjectFinderFilename)target).injectFilename("movies1.txt");
- }
- }
- // ==
- class Tester {
- private Container container;
- private void configureContainer() {
- container = new Container();
- // 注册组件。完成创建组件。
- registerComponents();
- // 注册注入器。完成组件注入。
- registerInjectors();
- container.start();
- }
- private void registerComponents() {
- // 这里模式是 组件名 - 组件
- container.registerComponent("MovieLister", MovieLister.class);
- container.registerComponent("MovieFinder", ColonMovieFinder.class);
- }
- private void registerInjectors() {
- // 这里的模式是 注入接口 - 注入器
- // 容器会遍历所有的组件,如果组件实现了注入接口,将调用对应的注入器,将这个组件作为参数,传递给注入器
- container.registerInjector(InjectFinder.class, container.lookup("MovieFinder"));
- container.registerInjector(InjectFinderFilename.class, new FinderFilenameInjector());
- }
- public static void main(String[] args) {
- configureContainer();
- MovieLister lister = (MovieLister)container.lookup("MovieLister");
- Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
- assertEquals("Once Upon a Time in the West", movies[0].getTitle());
- }
- }
(2)Service Locator 服务定位器
组件管理器将组件交给一个全局的服务者。组件的使用者主动向这个全局的服务者索取需要的组件。
参考
- [1] 如何理解IoC(Inversion of Control) http://segmentfault.com/q/1010000000755828
- [2] What is Inversion of Control? http://stackoverflow.com/questions/3058/what-is-inversion-of-control
- [3] InversionOfControl http://martinfowler.com/bliki/InversionOfControl.html
- [4] Inversion of Control Containers and the Dependency Injection pattern http://martinfowler.com/articles/injection.html
IoC控制反转与DI依赖注入的更多相关文章
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- [转帖]什么是IOC(控制反转)、DI(依赖注入)
什么是IOC(控制反转).DI(依赖注入) 2018-08-22 21:29:13 Ming339456 阅读数 20642 原文地址(摘要了部分内容):https://blog.csdn.net ...
- Spring的三大核心思想:IOC(控制反转),DI(依赖注入),AOP(面向切面编程)
Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧) 1.IoC是什么? IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多 ...
- 谈谈php里的IOC控制反转,DI依赖注入(转)
转自:http://www.cnblogs.com/qq120848369/p/6129483.html 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和" ...
- Spring-初识Spring框架-IOC控制反转(DI依赖注入)
---恢复内容开始--- IOC :控制反转 (DI:依赖注入)使用ioc模式开发 实体类必须有无参构造方法1.搭建Spring环境下载jarhttp://maven.springframework. ...
- 学习Spring IOC控制反转和DI依赖注入总结
30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...
- 三大框架 之 Spring(IOC控制反转、DI依赖注入)
目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...
- spring(一) IOC 控制反转 、DI 依赖注入
IOC 控制反转:创建对象的方式 变成了由Spring来主导 IOC底层原理:对象工厂 1.导入jar包:4个核心jar和1个依赖jar spring-beans-4.3.9.RELEASE.jar ...
- .net 温故知新:【7】IOC控制反转,DI依赖注入
IOC控制反转 大部分应用程序都是这样编写的:编译时依赖关系顺着运行时执行的方向流动,从而生成一个直接依赖项关系图. 也就是说,如果类 A 调用类 B 的方法,类 B 调用 C 类的方法,则在编译时, ...
随机推荐
- Maven之Hello World入门实例
1.使用eclipse创建maven工程在eclipse中,选择新建工程的时候,选择other,找到maven 下一步,下一步,直到出现类似如下图片点击finish即可完成maven工程创建. 运行的 ...
- asp.net mvc 如何调用微信jssdk接口:分享到微信朋友(圈)| 分享到qq空间
如何在asp.net mvc 项目里, 调用微信jssdk接口,现实功能: 分享到微信朋友(圈)| 分享到qq空间 1 创建一个Action,准备一些数据,初始化数据(签名): /// <sum ...
- SVG的路径动画效果
使用SVG animateMotion实现的一个动画路径效果,相关代码如下. 在线调试唯一地址:http://www.gbtags.com/gb/debug/c88f4099-5056-4ad7-af ...
- [Java拾遗一] XML的书写规范与解析.
前言今天天气大好, 起了个大早开始总结一些常用的基础知识. XML一直来说都很陌生, 使用大多是用于配置文件, 之前并没有细究过其中的约束规范, 今天刚好没事来学习并总结下. 1,XML基础介绍 XM ...
- Django MVC simple
- atitit.解决net.sf.json.JSONException There is a cycle in the hierarchy
atitit.解决net.sf.json.JSONException There is a cycle in the hierarchy 1. 环境:使用hibernate4跟个,,要不个哪的对象系列 ...
- atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型运行期获得Dialect
atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型运行期获得Dialect #-----原理 Hibernate 运行期获得Dialect 2010-07-28 12:59 ...
- paip.重装系统后firefox火狐收藏夹的恢复
paip.重装系统后firefox火狐收藏夹的恢复 1.使用procmon跟踪ff保存收藏时候的读写文件.. D:\Users\attilax\AppData\Roaming\Mozilla\Fire ...
- java生成生成图片缩略图
/** * */ package com.fkhwl.fkhserver.core.utils; import java.awt.Image; import java.awt.image.Buffer ...
- java基础学习总结——java环境变量配置
前言 学习java的第一步就要搭建java的学习环境,首先是要安装JDK,JDK安装好之后,还需要在电脑上配置"JAVA_HOME”."path”."classpath& ...