Guice系列之用户指南(十)
原文地址: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系列之用户指南(十)相关推荐
- Guice系列之用户指南(七)
原文地址:https://code.google.com/p/google-guice/wiki/ToConstructorBindings Constructor Bindings(构造器绑定):在 ...
- Guice系列之用户指南(五)
原文地址:https://code.google.com/p/google-guice/wiki/ProviderBindings ProviderBindings(提供者绑定):就是实现Provid ...
- Guice系列之用户指南(八)
原文地址:https://code.google.com/p/google-guice/wiki/BuiltInBindings Built-in Bindings(内建的绑定):即时在injecto ...
- [转载]Guice 1.0 用户指南
http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...
- Guice 1.0 用户指南
http://code.google.com/p/google-guice/ 用 Guice 写 Java Guice 1.0 用户指南 (20070326 王咏刚 译自:http://docs.go ...
- Java架构师之旅(二十九 附录《MyBatis3 用户指南》中文版)
夜光序言: 岁月波光粼粼,赋予爱与生命,唯有生活不能被他人代替,只会有寂寞相随~~ 正文: MyBatis 3 2010.08.01 翻译的一个版本,虽难比较老了,但是有一些基础还是值得学习,毕竟是 ...
- Logos系列FPGA PCB设计用户指南
logos PCB 用户指南 是 logos 系列 FPGA 芯片 的 PCB 推荐 设计 说明 文件 . 用户在分配完FPGA 管脚后,一定要跑一遍 工程文件确认管脚定义是否合理. logos系列 ...
- QCC304x系列开发教程(实战篇) 之5.3 QCC3040之QACT用户指南
高通蓝牙耳机QCC304x开发详解汇总(持续更新中) 查看全部文章地址QCC304x系列开发教程(实战篇) 之5.3 QCC3040之QACT用户指南_心跳包的博客-CSDN博客 版权归作者所有,未 ...
- Gradle 2.0 用户指南翻译——第五十六章. 多项目构建
本文禁止w3cschool转载! 翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc . 本文翻译所在分支:https://github.com/m ...
最新文章
- PHP 预编译加速: eAccelerator的安装和性能比较
- autosar中com模块_详细介绍AUTOSAR各个模块作用PART1(OS,SYS)
- HTTP相关知识 - 1
- 有云服务器还需要云虚拟主机吗,有云服务器还需要云虚拟主机吗
- java特性多态,90%的人看完都说好
- mi6 android版本,小米6:我依旧是王,MIUI10.4.2稳定版与AndroidP同时到来
- 潜藏中国30年,营收远超老干妈6倍,它才是真正的隐形辣酱冠军
- Rancher Managed Network实践
- nginx 安全加固心得
- 电脑tf卡检测不到_电脑不认TF卡,有什么方法
- 如何零基础转行成为一个自信的前端达人
- 【超快捷】Windows系统自带的快捷键合集
- 微信h5获取用户地址信息
- 凸优化“傻瓜”教程-----凸优化基础知识
- 低调,中国的FPGA到底有多强?!
- 【PAT乙级】1009 说反话
- Xshell配色美化
- 【免费SEO工具分享】长尾关键字挖掘器:外贸拓词长尾关键词挖掘工具
- 充电宝推荐评测,2022年值得买的充电宝盘点
- 基于单片机仓库温度检测系统设计
热门文章
- Java语法基础-2
- 掘金翻译计划,翻译掘金上优质的英文文章
- python002 一 eg: Python 入门技巧__环境搭建__git使用、git本地操作、 自建gitlab服务器
- ncbi查找目的基因序列_基于PrimerBank和NCBI数据库的引物查找与设计
- 鸿蒙适配倒计时,倒计时2天!首批鸿蒙OS适配名单确定,你的手机在列吗?
- Zabbix监控Windows客户端设置
- Linux下的tar归档及解压缩功能详解
- c语言设置程序自动执行,c语言如何设置程序进程执行优先权
- Linux 0.11进程运行轨迹的跟踪,进程运行轨迹的跟踪与统计
- splice方法_JavaScript数组常用方法