原文地址:https://code.google.com/p/google-guice/wiki/Scopes

Scopes:作用域。

默认情况下,Guice每次在调用时都会返回一个新的实例,这种行为是可以通过作用域配置的,作用域允许复用对象实例。在一个应用服务的生命周期中,对象可能是单例的(@Singleton),也可能是一个回话的(@SessionScoped),也可能是一个请求的(@RequestScoped)。Guice在web应用中也包含一个servlet扩展的作用域。自定义作用域可以在不同类型的应用中使用。

Applying Scopes
作用域使用有不用的方式,例如注解,

1
2
3
4
@Singleton
public class InMemoryTransactionLog implements TransactionLog {
  /* everything here should be threadsafe! */
}

也可以配置在代码里,

1
bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class);

也可以注解在@Provides方法处,

1
2
3
4
@Provides @Singleton
  TransactionLog provideTransactionLog() {
    ...
  }

如果有些冲突的作用域同时在一个类型上或者代码里的bind()方法上配置,那么bind()的配置生效。如果一个类型你不想给它设置要作用域,那么就绑定Scopes.NO_SCOPE。

像链接绑定那样,作用域应用于绑定的父类型,而不是绑定目标实现类。设想我们有一个同时实现Bar接口和Grill接口的实现类Applebees,这就要求需要同时绑定的这两种类型,一种是类型Bar,另一种是Grill:

1
2
bind(Bar.class).to(Applebees.class).in(Singleton.class);
bind(Grill.class).to(Applebees.class).in(Singleton.class);

这是因为作用域应用于这个绑定的类型(Bar,Grill),而不是满足这个类型的实现类Applebees,为了允许只有一个实例,用一个注解@Singleton声明在父类型上,或者在代码里绑定。

1
bind(Applebees.class).in(Singleton.class);

这种绑定使得以上的其他两种.in(Singleton.class)语句不必要。这种in()语句还接受像RequestScoped.class或者是ServletScopes.REQUEST的注解:

1
2
3
bind(UserPreferences.class)
      .toProvider(UserPreferencesProvider.class)
      .in(ServletScopes.REQUEST);

这种注解是推荐优先的,因为它允许这个模块在不同的类型应用中复用,打个比方,一个被@RequestScoped注解的对象即能够在web应用的http请求中被使用,也可以在一个API服务器的rpc中被使用。

Eager Singletons
Eager Singletons(各种饥渴的单例):不是延迟的,是饿汉式的单例。
Guice有特殊的语法定义把单例为饿汉式的:

1
bind(TransactionLog.class).to(InMemoryTransactionLog.class).asEagerSingleton();

Guice有特殊的语法定义把单例为饥渴的:

饿汉式的单例可以很快揭示初始化问题,并确保最终用户获得一致的,直观的体验。懒汉式的单例保证了一个快速的编辑-完成-启动的开发周期,用这个Stage的枚举可以区分那种策略被使用:

PRODUCTION DEVELOPMENT
.asEagerSingleton() eager eager
.in(Singleton.class) eager lazy
.in(Scopes.SINGLETON) eager lazy
@Singleton eager* lazy

Guice会在已知类型的情况下创建饿汉式单例,这些类型都是在自己的模块,并加上这些类型递归依赖提到的类型。

Choosing a scope

选择一种作用域,如果一个对象是有状态的,那么这个作用域就明显了,每个应用都是@Singleton的,每个请求都是@RequestScoped等等。如果一个对象是没有状态的,并且创建开销是很小的,那么作用域就没有必要,就不用绑定作用域,Guice会按需要创建不同的实例。

许多单例在java应用中是很流行的但是但它们没有提供多大的价值,尤其是当涉及依赖注入。尽管单例可以节省对象创建开销,或者晚一点的垃圾回收,获取一个单例的句柄得到需要同步。单例是很有用的:
有状态的对象,例如配置或者计数
创建昂贵或者查找昂贵的对象
占用资源,如数据库连接池对象

Scopes and Concurrency

作用域和并发,类型被@Singleton和@SessionScoped注解的一定是线程安全的,任何被注入到这些类型的也一定是线程安全的,减少可变性来限制一些需要并发保护的状态。
@RequestScoped对象不需要线程安全,一个@Singleton和@SessionScoped对象来依赖@RequestScoped对象,这是一个错误常识。如果你需要一个对象在一个较窄的范围内,注入该对象的提供者。

Guice系列之用户指南(十)相关推荐

  1. Guice系列之用户指南(七)

    原文地址:https://code.google.com/p/google-guice/wiki/ToConstructorBindings Constructor Bindings(构造器绑定):在 ...

  2. Guice系列之用户指南(五)

    原文地址:https://code.google.com/p/google-guice/wiki/ProviderBindings ProviderBindings(提供者绑定):就是实现Provid ...

  3. Guice系列之用户指南(八)

    原文地址:https://code.google.com/p/google-guice/wiki/BuiltInBindings Built-in Bindings(内建的绑定):即时在injecto ...

  4. [转载]Guice 1.0 用户指南

    http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...

  5. Guice 1.0 用户指南

    http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...

  6. Java架构师之旅(二十九 附录《MyBatis3 用户指南》中文版)

    夜光序言: 岁月波光粼粼,赋予爱与生命,唯有生活不能被他人代替,只会有寂寞相随~~ 正文: MyBatis 3 2010.08.01  翻译的一个版本,虽难比较老了,但是有一些基础还是值得学习,毕竟是 ...

  7. Logos系列FPGA PCB设计用户指南

    logos PCB 用户指南 是 logos 系列 FPGA 芯片 的 PCB 推荐 设计 说明 文件 . 用户在分配完FPGA 管脚后,一定要跑一遍 工程文件确认管脚定义是否合理. logos系列 ...

  8. QCC304x系列开发教程(实战篇) 之5.3 QCC3040之QACT用户指南

    高通蓝牙耳机QCC304x开发详解汇总(持续更新中) 查看全部文章地址QCC304x系列开发教程(实战篇)  之5.3 QCC3040之QACT用户指南_心跳包的博客-CSDN博客 版权归作者所有,未 ...

  9. Gradle 2.0 用户指南翻译——第五十六章. 多项目构建

    本文禁止w3cschool转载! 翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc . 本文翻译所在分支:https://github.com/m ...

最新文章

  1. PHP 预编译加速: eAccelerator的安装和性能比较
  2. autosar中com模块_详细介绍AUTOSAR各个模块作用PART1(OS,SYS)
  3. HTTP相关知识 - 1
  4. 有云服务器还需要云虚拟主机吗,有云服务器还需要云虚拟主机吗
  5. java特性多态,90%的人看完都说好
  6. mi6 android版本,小米6:我依旧是王,MIUI10.4.2稳定版与AndroidP同时到来
  7. 潜藏中国30年,营收远超老干妈6倍,它才是真正的隐形辣酱冠军
  8. Rancher Managed Network实践
  9. nginx 安全加固心得
  10. 电脑tf卡检测不到_电脑不认TF卡,有什么方法
  11. 如何零基础转行成为一个自信的前端达人
  12. 【超快捷】Windows系统自带的快捷键合集
  13. 微信h5获取用户地址信息
  14. 凸优化“傻瓜”教程-----凸优化基础知识
  15. 低调,中国的FPGA到底有多强?!
  16. 【PAT乙级】1009 说反话
  17. Xshell配色美化
  18. 【免费SEO工具分享】长尾关键字挖掘器:外贸拓词长尾关键词挖掘工具
  19. 充电宝推荐评测,2022年值得买的充电宝盘点
  20. 基于单片机仓库温度检测系统设计

热门文章

  1. Java语法基础-2
  2. 掘金翻译计划,翻译掘金上优质的英文文章
  3. python002 一 eg: Python 入门技巧__环境搭建__git使用、git本地操作、 自建gitlab服务器
  4. ncbi查找目的基因序列_基于PrimerBank和NCBI数据库的引物查找与设计
  5. 鸿蒙适配倒计时,倒计时2天!首批鸿蒙OS适配名单确定,你的手机在列吗?
  6. Zabbix监控Windows客户端设置
  7. Linux下的tar归档及解压缩功能详解
  8. c语言设置程序自动执行,c语言如何设置程序进程执行优先权
  9. Linux 0.11进程运行轨迹的跟踪,进程运行轨迹的跟踪与统计
  10. splice方法_JavaScript数组常用方法