默认情况下,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之作用域的更多相关文章

  1. jdbc框架 commons-dbutils+google guice+servlet 实现一个例子

    最近闲着无聊,于是看了一下jdbc框架 commons-dbutils与注入google guice. 我就简单的封装了一下代码,效率还是可以的.... jdbc+google guice+servl ...

  2. Google Guice学习

    学习动力:公司项目使用 官方文档:https://github.com/google/guice/wiki/Motivation 学习阶段:入门 主要部份: 简介 Bindings方式 Scopes设 ...

  3. 依赖注入框架Google Guice 对象图

    GettingStarted · google/guice Wiki https://github.com/google/guice/wiki/GettingStarted sameb edited ...

  4. Google Guice 之绑定1

    绑定和依赖注入区别 绑定,使用时 需要通过 injector 显示获取 依赖注入,只需要显示获取主类,他的依赖是通过@Injector 和 绑定关系 隐式注入的 http://blog.csdn.ne ...

  5. google guice

    1 google guice是什么 google guice是一个轻量的DI容器. 2 guice和spring对比 spring的配置放在xm文件中,guice的配置放在Module中. guice ...

  6. 史上最好用的依赖注入框架Google Guice【转】

    Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC).Guice非常小而且快. (其他的依赖注入框架还有Dagger,Spring) Spring ...

  7. 【曹工杂谈】Maven IOC容器的下半场:Google Guice

    Maven容器的下半场:Guice 前言 在前面的文章里,Maven底层容器Plexus Container的前世今生,一代芳华终落幕,我们提到,在Plexus Container退任后,取而代之的底 ...

  8. Google Guice结合模式

    于Guice于,喷油器装配工作是一个对象图,当请求类型实例,喷油器根据推断对象如何映射到创建的实例.解决依赖.要确定如何解决的依赖就需要配置喷油器结合的方式. 要创建绑定(Binding)对象,能够继 ...

  9. google guice @inject comments

    refer this document: http://blog.chinaunix.net/uid-20749563-id-718418.html @Inject注入方式,用@Inject来标识那个 ...

随机推荐

  1. Log 日志工具类 保存到文件 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Java 线程内异常处理

    Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结.最麻烦的是,在线程中抛出的异常即使使用try...ca ...

  3. 深入理解JSON

    一.JS判断字符串是否为JSON的方法: function isJSON(str) { if (typeof str == 'string') { try { JSON.parse(str); ret ...

  4. 使用ECharts实现数据图表分析

    一.ECharts介绍 实现对统计数据的图形分析之前用过JFreeChar,但它是用纯java实现编码繁琐且效果不佳,后来又使用过Fusioncharts 报表工具,它是基于Flash的图表组件.以X ...

  5. Android -- 拷贝assets下的资源文件到SD卡中(可以超过1M)

    很多手机游戏,在安装APK之后都得需要下载相应的资源包,然后才能进入游戏. 有这样一个需求:就是游戏中需要的资源包打在APK内,随apk一起进行安装到手机中. 这样就不需要,在安装APK之后,去下载资 ...

  6. 微博推荐算法学习(Weibo Recommend Algolrithm)

    原文:http://hijiangtao.github.io/2014/10/06/WeiboRecommendAlgorithm/ 基础及关联算法 作用:为微博推荐挖掘必要的基础资源.解决推荐时的通 ...

  7. HttpContext.Current.Cache 和 HttpRuntime.Cache

    HttpRuntime.Cache:用于winfrom 和 web HttpContext.Current.Cache 用于web .NET中Cache有两种调用方式:HttpContext.Curr ...

  8. Android IO存储总结

    1 前言  android设备的存储特点:  分内存和SD卡两种存储设备,且android设备存储空间小,且系统碎片化等情况.     SD卡:老版本的android设备 不存在内置SD        ...

  9. 3DMax脚本插件--改动材质&贴图名称

    从网上淘到了一套人物的模型,当时的心情是激动无比,掏出用的不熟练的3DMax折腾了半天.突然发现了一个蛋疼的事儿,所有的模型文件,材质名称,子材质,以及贴图所实用的是中文命名!! ! 尽管说是能跑,只 ...

  10. Debian GNU Linux服务列表的获取、服务的关闭/开启、服务在启动时是否自己主动执行的生效/失效

    /*********************************************************************  * Author  : Samson  * Date   ...