Google Guice之作用域
默认情况下,Guice获取一个实例时。每次都会返回一个新的对象。
这个行为能够通过scopes进行配置。Scopes同意你复用实例:
应用整个生命周期(@Singleton),会话(@Session),请求(@RequestScoped),Guice还提供为Web应用提供了一种Servlet扩展作用域。而且在Guice还能够自己定义范围。
Guice使用注解来标识作用域,将注解加入到某一类型的实现类上:
@Singleton
public class InMemoryTransactionLog implements TransactionLog {
/* everything here should be threadsafe! */
}
作用域也能够使用bind语句进行配置:
bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class);
@Provides方法加入作用域注解:
@Provides @Singleton
TransactionLog provideTransactionLog() {
...
}
假设在配置作用域时,使用注解与bind()语句存在冲突,那么以bind()中的配置为准。假设某一类型不想指定作用域则能够使用
Scopes.NO_SCOPE.
在链接绑定中,作用域是应用于绑定源上,而不是应用了绑定目标上。假如我们有一个Appleess类实现了Bar和Grill接口,
以下的绑定配置就存在两个实例。一个用于Bar。还有一个用于Grill:
bind(Bar.class).to(Applebees.class).in(Singleton.class);
bind(Grill.class).to(Applebees.class).in(Singleton.class);
这是由于作用域应用于绑定源(Bar,Grill),而不是绑定目标(Appless)。假设要求仅仅创建一个实例,则能够在Appless类上加入@Singleton注解。或者再加入一个绑定配置:
bind(Applebees.class).in(Singleton.class);
该绑定配置就使得两个.in(Singleton.class)语句变得多余了。in()语句不仅能够接收一个Scope注解,如RequestScope.class 。还能够接收Scope实例,如ServletScopes.REQUEST:
bind(UserPreferences.class)
.toProvider(UserPreferencesProvider.class)
.in(ServletScopes.REQUEST);
使用注解来配置作用域是更合适的,由于这样能够使Module对象在不类型中复用。
Guice有一种特殊的语法来定义须要马上创建的单例对象(Eager Singletons):bind(TransactionLog.class).to(InMemoryTransactionLog.class).asEagerSingleton();
Eager Singletons对象保证终端使用者获得始终如一的体验。Lazy singletons则更适用于edit-compile-run开发周期。能够通过Stage枚举来选择使用哪一种策略。
| PRODUCTION | DEVELOPMENT | |
| .asEagerSingleton() | eager | eager |
| .in(Singleton.class) | eager | lazy |
| .in(Scopes.SINGLETON) | eager | lazy |
| @Singleton | eager* | lazy |
*号表示仅仅有已知类型才会马上创建单例对象。所谓已经类型为在Module中使用的类加上这些类的传递性依赖。
怎样选择作用域:
假设一个对象是用状态的,它的状态就非常明显了。每一个应用使用则是@Singleton,每一个请求使用则是@RequestScoped。
假设一
个对象是无状态的而且创建的代价非常小。就没有必要配置作用域了。Guice每次都创建一个新的对象。
单例模式在Java应用中非常流行,但这样不能提供多个对象特别是在使用了依赖注入之后。尽管单例模式降低了对象的创建、使垃圾回收推后。但单例对象的初始化须要进行同步。
单例对象最适用于:
a.有状态对象,假设配置对象或者计数器
b.要花非常大的代价去创建或者查找
c.捆绑了资源的对象。比如数据库连接池
当一个类加上了@Singleton或者@SessionScoped注解时。它必须是线程安全的。并且被注入到这个类中的类也必须是安全的,应该限制须要进行并发控制状态以最大限度地降低可变性。
@RequestScoped对象没有必须是线程安全的,所以一个常见的错误是一个@Singleton或@SessionScoped对象依赖了一个@RequestScoped对象。
Google Guice之作用域的更多相关文章
- jdbc框架 commons-dbutils+google guice+servlet 实现一个例子
最近闲着无聊,于是看了一下jdbc框架 commons-dbutils与注入google guice. 我就简单的封装了一下代码,效率还是可以的.... jdbc+google guice+servl ...
- Google Guice学习
学习动力:公司项目使用 官方文档:https://github.com/google/guice/wiki/Motivation 学习阶段:入门 主要部份: 简介 Bindings方式 Scopes设 ...
- 依赖注入框架Google Guice 对象图
GettingStarted · google/guice Wiki https://github.com/google/guice/wiki/GettingStarted sameb edited ...
- Google Guice 之绑定1
绑定和依赖注入区别 绑定,使用时 需要通过 injector 显示获取 依赖注入,只需要显示获取主类,他的依赖是通过@Injector 和 绑定关系 隐式注入的 http://blog.csdn.ne ...
- google guice
1 google guice是什么 google guice是一个轻量的DI容器. 2 guice和spring对比 spring的配置放在xm文件中,guice的配置放在Module中. guice ...
- 史上最好用的依赖注入框架Google Guice【转】
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC).Guice非常小而且快. (其他的依赖注入框架还有Dagger,Spring) Spring ...
- 【曹工杂谈】Maven IOC容器的下半场:Google Guice
Maven容器的下半场:Guice 前言 在前面的文章里,Maven底层容器Plexus Container的前世今生,一代芳华终落幕,我们提到,在Plexus Container退任后,取而代之的底 ...
- Google Guice结合模式
于Guice于,喷油器装配工作是一个对象图,当请求类型实例,喷油器根据推断对象如何映射到创建的实例.解决依赖.要确定如何解决的依赖就需要配置喷油器结合的方式. 要创建绑定(Binding)对象,能够继 ...
- google guice @inject comments
refer this document: http://blog.chinaunix.net/uid-20749563-id-718418.html @Inject注入方式,用@Inject来标识那个 ...
随机推荐
- .Net应用程序打包部署总结
编译源代码并完成测试以后,开发过程其实并没有结束.在这个极端,需要把应用程序提供给用户.无论是ASP.NET应用程序,客户端应用程序还是 Compact Framework构建的应用程序,开发出来的软 ...
- angular6 NgModule中定义模块module
用这个@NgModule()这个decorator ,放在一个class的上面,这个class一个一个module了 @NgModule() 里面的参数是一个对象,用来配置的,声明这个module里面 ...
- 一次真实的蓝屏分析 ntkrnlmp.exe
故事背景: 话说我一直都是远程公司的电脑,在我晚上11点敲代码敲得正爽的时候,被远程的主机挂掉了,毫无征兆的挂掉了,我特么还好有闲着没事就ctrl + s保存代码的习惯,要不然白敲了那么久,我以为是公 ...
- SharpDevelop 版本信息
mscorlib,4.0.0.0,C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll SharpDevelop,5.1.0.4936, ...
- lua接收图片并进行md5处理
需要luacurl(http://luacurl.luaforge.net/)和MD5两个库函数 curl = require("luacurl") require("m ...
- rapidxml修改节点的值
1.rapidxml修改节点的value,修改之后,序列化还是原来的值,具体原因是什么,要看rapidxml是怎么实现的.如下: void TestRapidXml() { ]; sprintf(xm ...
- Javascript游戏,街头霸王
在线演示 本地下载 街头霸王,有没有记起点什么?我想起了那个有颗大槐树的老院子,还有一台小霸王和一个儿时的伙伴.
- php之快速入门学习-13(PHP 循环 - While 循环)
PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...
- 解压版MySQL安装后初始化root密码
1: C:\Users\gechong>mysql
- 深入理解 Linux 内存管理
1. 内存地址 以Intel的中央处理器为例,Linux 32位的系统中.物理内存的基本单位是字节(Byte),1个字节有8个二进制位. 每一个内存地址指向一个字节,内存地址加1后得到下一个字节的地址 ...