默认情况下,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. Android GUI之View布局

    在清楚了View绘制机制中的第一步测量之后,我们继续来了解分析View绘制的第二个过程,那就是布局定位.继续跟踪分析源码,根据之前的流程分析我们知道View的绘制是从RootViewImpl的perf ...

  2. TextBox_TextChanged

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { TextBox textBox = sender a ...

  3. 解决Sublime包管理package control 报错 There are no packages available for installation

    解决Sublime包管理package control 报错 There are no packages available for installation 真的是哔了狗了,要不是我机智的重新安装了 ...

  4. leetcode第一刷_ Flatten Binary Tree to Linked List

    提示中说明了,改动后的链表相当于原树的前序遍历结果.前序遍历是根左右,因为要把转换后的左子树链接到根节点的右子树上,因此进入递归之后要先把节点的右子树保存下来,然后进入左子树,左子树转换后应该返回最后 ...

  5. 在Foreda8上安装libaio-0.3.105-2.i386.rpm

    libaio-0.3.105-2.i386.rpm是安装MySql必须的包,可以从这里下载:http://pan.baidu.com/share/link?shareid=2348086735& ...

  6. matlab:eval用法

    1.自动生成变量 % auto general variabalsb=rand(3,3)for i=1:8    eval(['a_',num2str(i),'=','b(',num2str(i),' ...

  7. IDEA+Gradle相关资料

    要注意下载的版本,不能过于陈旧,否则会报错,导致无法正常配置. 具体配置参考:https://my.oschina.net/u/1994816/blog/297967 IDEA下载地址:https:/ ...

  8. 算法笔记_193:历届试题 连号区间数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R ...

  9. ES6 async await 面试题

    转自:https://juejin.im/post/5c0397186fb9a049b5068e54 1.题目一 async function async1(){ console.log('async ...

  10. jersey获取各个参数的总结

    service端: @Path("/hello") public class HelloService { @GET @Produces("text/plain" ...