3.2.    “好莱坞原则”

看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想。如果说传统的组件间耦合方式,例如new、工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模式则是其反向的,即被动地等待别人做好一个依赖对象提供给我。

在美国好莱坞众多电影工厂在寻找演员的时候通常奉行着这么一个原则:不要找我,需要的时候我去找你(“Don’tcall us; we’ll call you!”),把相同的思路运用到我们的软件工程里通常也被称作“好莱坞原则”(HollywoodPrinciple),即告诉开发者不要主动去构建依赖对象,而是在需要的时候由依赖注入容器把对象提供过来。

这种思路与以前的new、工厂创建等方式是正好相反的思想,因此在最开始这样的思想会被称为“控制反转(IoC)”。从这我们也可以看到,依赖注入的核心思想就是:由容器提供给我们需要的依赖对象。

3.3.    依赖注入框架简介

这一节我们简单介绍一下Java世界里都有哪些依赖注入框架,包括在3.1节我们多次提到的JBoss Seam、Spring Framework、Google Guice等。

依赖注入思想开始流行以来,Java世界里已经诞生了很多种依赖注入框架。其中,ApacheAvalon被认为是最早出现的依赖注入框架,之后很多的Apache工程都是基于这个框架实现的,但由于其功能限制比较多,如今已经逐渐退出了历史舞台。此后又诞生了许多像PicoContainer、NanoContainer、ApacheHivemind等依赖注入框架,也有诸如SmartyPants-IoC这样专门面向Adobe Flex和Flash应用程序开发的依赖注入框架。

但是依赖注入只是面向对象语言中以改进组件耦合方式为核心的一种开发思想,而开发一个完整IT系统需要涉及很多的开发领域,比如表现层开发、逻辑层开发、持久化层开发等等,因此开发者迫切需要一个基于依赖注入思想的覆盖全开发领域(full-stack)的框架。2003年Spring Framework的诞生宣告着这种基于依赖注入思想的full-stack开发框架开始占据主流。

Spring无疑是覆盖全开发领域的依赖注入框架的成功典范,甚至在诞生之初被当作依赖注入的代名词,至今仍是使用者最广泛、社区成员最多的框架。不过随着其复杂XML配置、对象生命周期管理等的复杂性、开发Spring插件过程中对该框架的强依赖性等原因,以著名Java工程师、Hibernate的创始人Gaving King为核心的开发团队在2005年开发出了JBoss Seam框架,其也迅速地发展成为主流依赖注入开发框架之一。而在2007年,Google的著名Java工程师Bob Lee开发出了全新的基于Java5注解和Java EDSL配置的依赖注入开发框架Google Guice,解决了之前的框架中最常见的类型安全等问题,在如今的依赖注入框架世界里亦占有一席之地。大家熟知的Gmail邮件系统的前端服务,就是一个完全基于Guice开发的系统。

近年来随着Spring、Seam、Guice这三大主流开发框架的竞争与发展,各自取长补短,在其各自的最新版release当中很多主要功能的设计模式和使用方式上都已渐渐趋同。因此JCP组织提取了各方的优点,提出了JSR-299和JSR-330两个新的标准,正式将依赖注入列为JavaEE6的标准,即Contextualand Dependency Injection。今后所有宣称实现JavaEE6的中间件厂商,都要遵循这个标准提供依赖注入的实现。

依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .的更多相关文章

  1. 依赖注入及AOP简述(十二)——依赖注入对象的行为增强(AOP) .

    四.依赖注入对象的行为增强(AOP) 前面讲到,依赖注入框架的最鲜明的特点就是能够提供受容器管理的依赖对象,并且可以对对象提供行为增强(AOP)功能,所以这一章我们来讨论有关AOP的话题. 1.    ...

  2. 依赖注入及AOP简述(三)——依赖注入的原理

    3.     “依赖注入”登场 于是诸多优秀的IT工程师开始想出了更加轻量便利.更加具有可测试性和可维护性的设计模式——IoC模式.IoC,即Inversion of Control的缩写,中文里被称 ...

  3. 依赖注入及AOP简述(七)——FQCN请求模式

    2.2.    FQCN请求模式 为了弥补纯字符串请求模式中的类型安全问题,全类名(FQCN)请求模式就应运而生了.其思想便是,在向容器请求依赖对象的时候,不是通过字符串的标识符.而是通过被请求的依赖 ...

  4. 依赖注入及AOP简述(五)——依赖注入的方式 .

    二.依赖注入的应用模式 前面我们了解了依赖注入的基本概念,也对一些依赖注入框架进行了简单的介绍,这一章我们主要来讨论作为开发者如何利用依赖注入框架来实现依赖注入的设计思想. 1.     依赖注入的方 ...

  5. 依赖注入及AOP简述(一)——“依赖”的概念 .

    一.入门:依赖注入 作为一种全新的设计模式理念,“依赖注入”这个词汇在软件设计开发中已经是越来越耳熟能详了,而各种流行于开源社区的“依赖注入框架”,也越来越多的被当作软件工程开发过程中使用的基础框架. ...

  6. 依赖注入及AOP简述(六)——字符串请求模式 .

    2.     依赖注入对象的请求模式 前一节我们讨论了关于声明注入点的几种方法,这一节主要来介绍在注入点上如何定位到所需要的标识符的话题.基本上,我们可以用字符串为标识符来请求依赖对象.或者用全类名( ...

  7. 依赖注入及AOP简述(十三)——AOP应用举例(完结) .

    2.     AOP应用举例 在一般的应用程序开发中,有一些典型的AOP应用,使得开发者可以专注于业务逻辑本身,而不是与之完全无关的一些“方面”. l        首先就是关于前面介绍过的日志输出类 ...

  8. 依赖注入及AOP简述(十)——Web开发中常用Scope简介 .

    1.2.    Web开发中常用Scope简介 这里主要介绍基于Servlet的Web开发中常用的Scope. l        第一个比较常用的就是Application级Scope,通常我们会将一 ...

  9. 依赖注入及AOP简述(九)——单例和无状态Scope .

    三.依赖注入对象的Scope及其生命周期 在前面的章节我们讲到,依赖注入容器之所以能够区别于以往的ServiceLocator等容器,是在于其不但能够自动构建多层次的.完整的依赖关系图,并且可以管理依 ...

随机推荐

  1. PHP MySQL 连接数据库 之 Connect

    连接到一个 MySQL 数据库 在您能够访问并处理数据库中的数据之前,您必须创建到达数据库的连接. 在 PHP 中,这个任务通过 mysql_connect() 函数完成. 语法 mysql_conn ...

  2. SpringMVC的值传递

    值的传递分为从页面传到到controller和从controller传递到页面,下面分别进行介绍: package com.springmvc.web; import java.util.Map; i ...

  3. STL源代码剖析 读书总结

    <<STL源代码剖析>> 侯捷著 非常早就买了这本书, 一直没看, 如今在实验室师兄代码的时候发现里面使用了大量泛型编程的内容, 让我有了先看看这本书的想法. 看之前我对于泛型 ...

  4. 查看linux系统的开机时间/重启历史记录

    查看linux系统的开机时间/重启历史记录1.who -b命令[root@rusky opt]# who -b ---查看最后一次(上次)系统启动的时间 system boot Dec 27 05:0 ...

  5. 使用bulkCopy心得

    最近一直在到excel导入,无意中发现Bulk Insert 批量导入,于是研究了一下,在测试的时候一直有问题,然后找度娘帮忙,说新增DataTable数据结构的时候,每个列要与数据库设计时字段对应, ...

  6. angular controller之间通信方式

    对于日常开发中,难免会有controller之间通信需求.对于controller之间通信有两种方式可以做到. 用 Angular 进行开发,基本上都会遇到 Controller 之间通信的问题,本文 ...

  7. C#获取本机IP方法,获取本机局域网IP地址方法

    1. private void GetIP() { string hostName = Dns.GetHostName();//本机名 //System.Net.IPAddress[] address ...

  8. Android测试框架2(非原创)

    package com.example.sqlitedatabase.test; import android.content.ContentValues;import android.databas ...

  9. CREATE DATABASE建库语句详解

    原创地址:http://blog.csdn.net/guguda2008/article/details/5716939 一个完整的建库语句是类似这样的: IF DB_ID('TEST') IS NO ...

  10. EF Code Frist

    EF:学习资料 http://www.cnblogs.com/libingql/category/366833.html