三、依赖注入对象的Scope及其生命周期

在前面的章节我们讲到,依赖注入容器之所以能够区别于以往的ServiceLocator等容器,是在于其不但能够自动构建多层次的、完整的依赖关系图,并且可以管理依赖对象的Scope和对其进行行为增强。有关行为增强的话题我们会在下一章介绍,这里我们先来看看有关依赖对象的Scope及其生命周期管理的话题。

1.     依赖注入对象的Scope

Scope,即作用域,是指面向对象开发中所设计的某一类对象的生存期间。我们先从普通Java程序开发中最常用的单例和无状态两种Scope入手,之后再来讨论Web应用程序开发中几种常见的Scope。

1.1.    单例和无状态Scope

无状态Scope是最简单、生存期间最短的一种Scope,我们所有通过new出来的非静态对象都属于这种Scope,它随着使用这个对象的对象(可能是依赖者类,也可能是依赖者类里的一个方法)的消亡而消亡。反之,单例则是生存期间最长的一种Scope,它以静态的模式生存在JVM的“旧年代区域”,永远不会被JVM回收。比如我们肯定都写过或使用过类似这样的单例模式:

public class BankICBC implements Bank {

private static Bank bankICBC; // bankICBC为一个静态单例

private BankICBC() {} // 私有构造方法,使得外界无法直接new出其对象

public static Bank Instance() {

return null == bankICBC ? new BankICBC() : bankICBC; // 创建一个单例对象

}

// ……

}

还用我们取款的例子来说,假设这个储户用的存折类型是定期存单,取款之后银行要收回定期存单,这种情况下对于每一次取款的存折依赖来说,它都是一个无状态的,也就是说每次取款都需要一个新的存折,因此这个时候存折就是一个无状态的依赖。我们再假设这个储户附近只有一所银行,也就是说不管什么时候去取款都会去同一所银行,此时银行就是一个单例的依赖,每次执行withDraw方法是都是使用的同一个银行依赖对象。

在依赖注入框架之前,我们对于无状态的存折依赖和单例的银行依赖的创建,可能会分别使用new和静态的方式。new方式的诸多问题我们已经在第一章讨论过了。而静态的方式同样有着开发者负担管理JVM全局变量的不便或是易造成内存泄漏等诸多问题。依赖注入框架可以帮助开发者管理这些Scope的依赖,使得开发者获取不同Scope的依赖对象变得非常简单并且不需要自己去维护它。

下面我们以Seam框架为例说明如何定义这两种Scope。Spring、Guice框架也具有极为类似的定义方式,就不再具体举例了。

@Name("bank")

@Scope(ScopeType.APPLICATION) // 声明为单例Scope

public class BankICBC implements
Bank { // ……  }

@Name("depositBook")

@Scope(ScopeType.STATELESS) // 声明为无状态Scope

public class DepositBookICBC
implements DepositBook { // …… 
}

注意在依赖注入框架中,所谓“单例”并不是传统意义上的单例,它不是JVM中唯一存在的一个静态变量,而是以依赖注入容器(Injector)为单位唯一存在的非静态变量,从而避免了过多占用JVM的旧年代区域的内存等问题。

依赖注入及AOP简述(九)——单例和无状态Scope .的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .

    3.2.    “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...

随机推荐

  1. easy ui 如何单个引用其中某个插件?

    记录一下这个方法,前端时间一直在纠结这个问题,后来听一些前辈讲解后才恍然大悟,要单独引用某个插件,我们需要重视的是:easyloaer.js ,easy ui的下载包中也有easyloader的dem ...

  2. 【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎

    Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九, ...

  3. 【后缀数组】【poj2774】【 Long Long Message】

    题意: 求两个串的最长连续子串. 我的想法: 枚举第二个串...在第一个串的后缀数组中二分查找. 复杂度NlogN.最坏情况N^2 题解: (3)height 数组:定义height[i]=suffi ...

  4. .NET中的CSV导入导出(实例)

    导入代码,从csv文件得到datatable         /// <summary>        /// Get Data From Csv File         /// (Th ...

  5. UVa 11488 - Hyper Prefix Sets

    找 前缀长度*符合该前缀的字符串数 的最大值 顺便练了一下字典树的模板 #include <iostream> #include <cstdio> #include <c ...

  6. C++标准程序读书笔记-第三章错误和异常处理

    1.命名空间(namespace)std C++标准程序库中的所有标示符都被定义于一个名为std的namespace 2.标准异常类别 (1)语言本身或标准程序库所抛出的所有异常,都派生自基类exce ...

  7. C# 添加服务引用。

    1,服务引用给的实例(需要一个网址连接) http://192.168.17.131:12170/amtiot.gis.WCF/SpatialAnalysis.svc  (类似于这样的一个网址) 在网 ...

  8. mysql存储过程调试方法

    有如下一个存储过程 ), i_length ),OUT o_result INT) BEGIN SET @a= NULL; SET @b= NULL; SELECT id INTO @a FROM t ...

  9. 关于datetime和int 是否可为null的问题

    一个对象的属性中有一个datetime类型的属性,在赋值时未给予赋值,此时系统会分配给它一个最小的时间,不会是null值,与int类型相似,datetime也不会有null类型, 先来看一段代码: n ...

  10. 解决英文版Windows程序乱码

    前段时间由于工作需要装了一个英文版Windows,以至于在一些脚本和控制台程序里面处理汉字的时候总是显示乱码(比如:“???”). 在尝试了很多编码和解码的操作后,乱码问题还是没能很好的解决.后来才发 ...