首先,从dependency injection理解开始,咱不叫依赖注入,因为意译的和其实含义不太一样。后面都统一叫“DI”。一个小故事:
情境一
假设你在一个将出差当成家常便饭的公司工作。通常来说,你乘飞机来旅行。每次你赶飞机时,总是要安排taxi。你认识航空公司订票的人员,出租车公司安排taxi送你到机场的人员。你知道他们的电话,你知道通常订票的谈话内容。你的典型的旅行步骤如:
* 决定目的地,和希望到达时间;
* 给航空公司打电话,将必要的旅行信息传达出去,用以订票
* 给出租公司打电话,要求taxi从你住地送你到机场去赶某一具体航班(出租公司可能需要联络航空公司来得到航班的起飞时间表,机场信息,并计算从你住地至机场的的具体时间,及相应的到达你住地的时间)
* 获取机票,赶上taxi,开始出差之旅
如果现在你的公司突然更换原先订票的经纪以及相应的交流手段,你可能被迫进入重新熟悉的境地:
* 新的经纪公司,他们的交流方式(比如说,如果新的经纪通过互联网来做生意,而不是原来的电话)
* 用以成交的典型的谈话方式的次序(是数据,而不再是声音)
不仅仅是你,很可能你的许多同事也要对此变化进行适应。适应的过程往往要花上可观的时间。
情境二
现在让我们来假设整个程序有一点点不同。你们公司有一个行政部门。当你需要出差旅行的时候,行政部门的互动电话系统会给你打电话(事实上是将你和订票经纪公司挂起钩来)。在电话上,你只需回答特定的一套问题,来讲出你的目的地和需要的到达时间。机票订票系统是专为你们设计的,出租公司将计划好taxi的时间,同时,机票也会给你送上门来。
如果现在订票的经纪更换了的话,行政部门会知会这个变更,也许他们会相应调整订票经纪的工作流程。互动的电话系统可以重新程序化,以便于和经纪在互联网上沟通。但是,你和你的同事们不需要有任何的重新适应过程。你仍旧只需照先前的程序走就行了(所有的调整都由行政部门去做了)
依赖注入(Dependency Injection)
在上述两个情境中,你是客户,你依赖于经纪提供的服务。但是,情境二有些不同:
* 你不需要知道订票经纪人和电话 - 必要的话,公司行政部门会打电话给你
* 你不需要知道行政部门和订票经纪的交流程序和方式,虽然你知道如何与行政部门一个特定的交流方式
* 你不需要作出任何调整,即使当给你提供服务的经纪有变更的时候
这就是现实生活中的依赖性注入(DI)。这种方式看上去省不了你什么,但是当你把它应用到一个大公司里去时,他的节省是很可观的。
这是生活中的一个例子,可能会比较直观。在程序中由于DI多要定义interface,所以总结起来理解三句话就明白了DI是什么了:1、好莱坞理论:你别动,我回来找你!2、把服务之间的这种依赖的建立时间推后了,从编译器推迟到运行时;3、接口就是一个模具,要什么样的成品你就灌什么样的浆。
使用DI能得到什么?
对DI从整体来看,无论是作为一个设计模式,还是不同的框架,你可能都会问,我能从DI上得到些什么?以下就是一些好处
* 如果审视你的服务组件依赖性,它会包含两个子依赖性。一个是基于API或服务组件自身协议的专于某一领域的依赖性。另一个是泛指基于服务组件间实例、配置、和查询的技术协议上的依赖性。DI允许你将处理后者的代码转移到附带的代码边界上去(如XML文件或一些离你的’主‘方法不远的方法里)。这样,一些技术上的更改得以较容易地处理,因为客户端组件的开发人员可以集中精力于他们最拿手的-服务端某一特定领域的API。
* 如果你想创建即插即用的结构,从而你的最终用户和系统集成人员可能会要求延伸或更改服务端的功能,那么你用DI的方法来做会让事情变得很容易。DI让按开闭原理来建造软件变得容易。在举例中,我提到作为一个DI容器的Spring,其实Spring本身也大量地使用了DI。建造进Spring的一系列功能(如 AOP,交易处理等)实际上是用DI来插入这些即插即用的服务的。Spring框架也可以靠写一些额外的服务并用DI来插入它们得以延伸和拓展(比如说,spring模块,参见http://springmodules.dev.java.net)。
* 如果你真的在应用中,建立大量的细分的彼此间相互依赖的服务,很可能你要重新布局的次数,比你预计的要来的多。如果你真的用了DI的框架的话,你会很庆幸你当初的选择。
* 当你最初的假设开始变更的时候,你需要开始加强你的应用。比如,你有建在J2EE平台上的服务组件,它们之间靠JNDI来相互查询。如果你现在把代码移植到一个没有JNDI的环境中去,如果你当初用了DI的话,就没有一点问题。
待续。。。
分享到:
相关推荐
本书将带领读者深入了解Guice的各项功能,并通过实践案例来加深理解。具体的学习目标包括: - **了解DI基础知识**:掌握依赖注入的基本概念和原理。 - **掌握Guice的使用方法**:学会如何使用Guice进行依赖注入、...
Guice的目标是简化Java应用程序的构造和管理,通过自动装配对象依赖关系,让开发者可以专注于业务逻辑而不是对象的创建和组装。Guice 3.0是其一个重要的版本,提供了许多改进和新特性。 在Guice 3.0源码中,我们...
在学习Guice的过程中,了解和实践这些基本概念是至关重要的。通过创建简单示例,如“HelloWorld”程序,可以帮助我们更好地理解和掌握Guice的用法。同时,阅读博文(链接已给出)会提供更深入的指导和实际案例,以便...
1. **Guice模块**:在你的应用中,你需要创建一个继承自`AbstractModule`的类,然后在这个类中定义MyBatis和Guice的绑定规则。例如,你可以绑定DataSource、SqlSessionFactory等。 2. **MyBatis配置**:你需要提供...
Guice是一款轻量级的依赖注入(DI)框架,它使得在Java应用程序中管理对象的生命周期变得简单。ThrowingProviders允许提供者方法抛出受检异常,这在某些情况下非常有用,比如当初始化对象时可能出现的异常。 描述中...
Guice是Google开发的一款轻量级依赖注入框架,主要应用于Java应用程序。依赖注入是一种设计模式,它可以帮助开发者减少代码间的耦合,提高代码的可测试性和可维护性。Guice通过提供自动装配功能,使得对象之间的依赖...
NFSDB通常是一种分布式、高性能的键值存储系统,而Guice则是Google开发的一款轻量级依赖注入框架,用于简化Java应用的构建和测试。 【描述】提到的"org.liveSense.misc.log.config.default.zip"是一个与livesense...
当与Selenium(一个广泛使用的自动化测试工具,主要用于Web应用程序)和Ant(一个Java构建工具)一起使用时,它们共同构成了一套强大的自动化测试解决方案。 标签"reportng"强调了这个包的主要用途,即与ReportNG...
标题 "guice-spring-3.2.3.zip" 提示我们关注的是Guice与Spring框架的一个特定版本的...通过这个项目,开发者不仅可以学习到Guice和Spring的集成,还可以深入理解Maven插件的开发和使用,以及开源项目协作的基本流程。
Guice通过使用`@Inject`注解来自动注入依赖项,这使得代码更简洁且易于理解。例如,如果有一个`UserService`类依赖于`UserRepository`,可以这样定义: ```java public class UserService { private final ...
学习这个教程对于理解如何有效地使用Robojuice和Guice进行Android开发至关重要。 在实际开发中,使用Robojuice可以带来很多好处,比如: 1. **减少样板代码**:通过依赖注入,我们可以避免在每个Activity或Service...
此外,Gradle支持Groovy构建脚本,并通过丰富的领域模型来描述构建信息,这使得构建脚本更加直观且易于理解。Groovy作为一种敏捷开发语言,它的语法简洁且表达能力强,为Gradle的构建脚本提供了强大的表达能力。 接...
总而言之,《Apress.Google.Guice.Agile.Lightweight.Dependency.Injection.Framework.Apr.2008》是一本深入了解Google Guice和依赖注入理念的重要资源,适合Java开发者,特别是那些希望优化代码结构、提高代码质量...
Guice通过提供一种声明性的方式来配置这些依赖关系,使得代码更易于理解和维护。书中详细介绍了Guice的核心概念,包括模块(Modules)、注解(Annotations)、绑定(Bindings)以及提供者(Providers)。 1. **模块...
通过对这个压缩包的学习,开发者不仅可以掌握EXTJS4的组件使用和布局设计,还能了解到Guice的依赖注入原理和实践,同时也能深入理解MyBatis的映射机制和事务管理。这是一个很好的学习资源,特别是对于那些想要提升...
对于 GWT 应用,`Gin` 是 `Guice` 的一个变种,专门为 GWT 平台进行了优化。 `Mockito` 是一个流行的模拟框架,它允许我们在测试中替换真实的依赖,创建模拟对象来隔离被测试代码。这样可以避免在测试中涉及复杂的...
标题中的"stdlib-guice-hibernate-testing-6.1.2.zip...通过研究这个项目,开发者不仅可以深入理解Java注解驱动的配置方式,还能学习到如何使用Guice和Hibernate构建应用,以及如何编写和维护一个高质量的开源项目。