对于新技术反映比较慢,guice出来很久了,也只是看过一些简短的介绍而已。常常看到关于它和spring的比较,并且大都认为guice略胜一筹,这让我也忍不住想自己来比较一番。spring也有段时间没用了,所以就先到spring的网站瞅了一眼文档。因为同是IoC和DI容器,要比当然从这方面比,所以看文档的时候也更多的关注了这一部分。Chapter 1. Introduction(
http://static.springframework.org/spring/docs/2.0.x/reference/introduction.html)右边灰色小框子里边的一段背景介绍引起了我对IoC和DI概念的兴趣。原文如下:
引用
In early 2004, Martin Fowler asked the readers of his site: when talking about Inversion of Control: “the question is, what aspect of control are [they] inverting?”. Fowler then suggested renaming the principle (or at least giving it a more self-explanatory name), and started to use the term Dependency Injection. His article then continued to explain the ideas underpinning the Inversion of Control (IoC) and Dependency Injection (DI) principle.
If you need a decent insight into IoC and DI, please do refer to said article :
http://martinfowler.com/articles/injection.html.
看到这里我就有点惭愧了,虽然很长一段时间都认为自己在使用IoC和DI,并且也自认为明白为什么要这么做,但是对于“ What aspect of control are [they] inverting?”还真就说不清楚。于是只好老老实实点开Martin Fowler在04年写的文章,认真补习一下。
IoC(Inversion Of Control),通常译为控制反转,意思是程序将自己的控制权交给别人(系统,框架等),更具体的说就是你的程序写好了,什么时候调用就不由你来决定了。有一个非常经典的法则来形容这种情况——好莱坞法则(Hollywood Principle - "Don't call us, we'll call you"),就好像系统对某一功能模块说:你不要烦我了,用到你的时候我自然会叫你的。
在我印象里最早接触到的经典IoC应用应该是高中用VB写的程序。写VB程序无非就是编写针对画面上的每一个控件(文本框,按钮等)的事件响应代码片断。在写得时候,没法控制每一个事件的发生时间,这些都是由基于消息机制的系统来响应用户请求后调用的。也就是说将具体的实现(依赖)推后到了运行的时候。比较流行的另一种说法就是,将互相依赖的模块解耦(decouple)。
看过《重构》一书的人都应该对作者将编码和设计中的不良做法比做“bad smell”的说法印象深刻,而模块之间的高度耦合被公认为是最糟糕的几种味道之一。IoC就是解决这类问题的最好的除臭剂。所以IoC是一种方法,是设计思想,而不是什么高级的技术或者特性。Martin Fowler在它的文章中讽刺那些标榜自己的系统使用了IoC技术或者具有IoC特性的人就像某人在说:看,我的车很特别,因为它有轮子。他还举了一个很幼稚的例子,来证明IoC的平凡。现在我就举一个更幼稚的例子,这可能是我们大部分人小学就写过的程序(如果你参加过计算机培训班)。
// NaiveIoC.c
void one(){
printf("one\n");
}
void notOne(){
printf("not one\n");
}
void print(int i){
if(1==i)
one();
else
notOne();
}
main() {
int x;
printf("input number:\n");
scanf("%i",&x);
print(x);
}
在这个例子里,可以把print方法看作一个服务提供者,而one和notOne方法则是它能够提供的两种服务,main方法依赖于print所提供的服务,而使用哪种具体的print服务则是在运行时根据用户输入而决定的。在这个例子中,main方法自己扮演了IoC框架和服务使用者两个角色。
之所以用C语言来举例,并且在前边的描述中使用“模块”而不是“对象”,只是想说明,IoC的实践早在面向对象的开发方式出现前就已经存在了,只不过没有人去总结而已。它既不神秘,也不高深(指思想本身)。就像其他那些最简单但却最经典的理论一样平易近人。
分享到:
相关推荐
### 什么是控制反转(IoC)与依赖注入(DI) #### 控制反转(IoC) 控制反转(Inversion of Control,简称IoC)是软件工程领域的一个设计模式,主要用于简化对象之间的依赖关系管理。在传统的面向对象编程中,对象间的...
"IOC(DI)与AOP概念的理解" IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是软件设计中两个重要的概念。控制反转的意思是依赖关系的获取方式被反转了。所谓依赖,从程序的角度看,...
在.NET环境中,例如,可以使用Microsoft的Dependency Injection库(MS.DI),它是.NET Core框架的一部分,也可以与其他库如Autofac、Unity等结合使用。在Java中,Spring框架是实现IoC和DI的常用工具。 这个...
Spring的核心特性包括AOP(面向切面编程)和IOC(控制反转),以及依赖注入(DI)。以下是对这些概念的详细解释: **面向切面编程(AOP)** AOP是一种编程范式,它允许开发者将关注点从主业务逻辑中分离出来,例如...
什么是spring,spring核心,spring优点,spring体系结构, 入门案例,DI基础,核心API,文档内附代码
【标题】中的“手写IOC,DI,servlet”指的是开发者独立实现的控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)机制,并结合了Java Servlet技术来构建一个轻量级的Web应用程序框架。...
本文中,作者深入探索IOC模式的工作原理,给它一个更能描述其特点的名字——“依赖注入”(Dependency Injection),并将其与“服务定位器”(Service Locator)模式作一个比较。不过,这两者之间的差异并不太重要,...
标题 "ioc_di (1)" 暗示了我们即将探讨的话题是有关于IoC(Inversion of Control)和DI(Dependency Injection),这是Spring框架中的核心概念。这些概念在软件工程中至关重要,因为它们有助于实现松耦合和可维护性...
C#作为一种广泛应用的编程语言,提供了丰富的支持来实现DI和IoC。 首先,让我们澄清一下这两个术语。控制反转(IoC)是指将应用程序的控制权从代码内部转移到外部,通常是通过某种框架或容器来管理对象的生命周期和...
依赖注入(DI)是IOC的一个具体实现方式。在Spring框架中,DI允许我们在不修改代码的情况下改变对象的依赖关系。通过配置文件或注解,我们可以告诉Spring如何创建对象,以及哪些对象需要哪些依赖。DI使得组件之间的...
在软件开发中,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是两种重要的设计模式,它们对于实现灵活、可维护的代码具有重要作用。这些概念遵循了开闭原则(OCP,Open-Closed ...
本文主要探讨了一种基于Java的IOC(Inversion of Control,控制反转)/DI(Dependency Injection,依赖注入)框架的设计与实现。该框架作为一种可复用的设计构件,能够有效支持多层J2EE应用程序的构建,其核心价值...
2. **依赖注入(DI)**:DI是IOC的具体实现方式之一,它允许开发者声明组件之间的依赖关系,而不是直接在代码中创建或查找依赖对象。Spring容器会根据这些声明,在运行时自动将依赖对象注入到需要它们的组件中。这...
课堂笔记用30个类手写Spring V2.0版本之顶层设计IOC与DI
Spring 框架是 Java 开发中不可或缺的一部分,它以其强大的依赖注入(Dependency Injection, DI)和控制反转(Inversion of Control, IOC)特性而闻名。在这个名为“spring-demo02-IOC-DI案例”的压缩包中,我们将...
JAVAEE之Spring IoC&DI Spring IoC(Inversion of Control,即...Spring IoC&DI是JAVAEE开发中的一种重要机制,它提供了一种解耦合的方式,使得应用程序的各个组件之间能够松散耦合,提高了系统的灵活性和可维护性。
DI(Dependency Injection,依赖注入)是 IoC 的一种实现方式,它将组件之间的依赖关系交由框架来管理。 数据源(连接池) 数据源(连接池)是提高程序性能的一种方式,它可以在程序启动时实例化数据源,初始化...
### Spring入门学习:IOC与DI详解 #### 一、什么是IOC? **IOC**,全称为 **Inversion of Control**(控制反转),它并不是一项具体的技术,而是一种设计思想。在传统的Java开发过程中,当我们需要使用某个组件时...
【Spring 框架的IOC与DI理解】 Spring框架的核心特性之一是控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)。这两个概念在软件设计中起到了至关重要的作用,它们帮助开发者...