Guice 允许自定义一个实例的作用范围(一个实例作用于整个应用期间,一段会话期间,还是一次请求期间)。
内置的作用范围
- 单例(兼容
javax.inejct.Singleton
和com.google.inject.Singleton
) - 请求,需要用到 servlet 扩展模块中的
@RequestScoped
指定实例的作用范围
存在三种方式指定实例的作用范围
- 在需要依赖注入的实例的类型声明上使用注解,例如
@Singleton
- 通过
Module
类型中的 DSL,例如bind(TransactionLong.class).to(InMemoryTransactionLog.class).in(Singleton.class)
(最后的 in 方法指定了实例的作用范围) - 在
Module
类型注解了@Provides
的方法上使用注解,例如@Singleton
需要注意的一点是,Guice 中的作用范围是和 Guice Key
绑定的,而不是作为 value 的实例。如果需要指定一个实例的作用范围,需要使用使用 bind(MyClass.class).in(Singleton.class)
或者在实例的具体类型声明上通过注解指定作用范围。
NO_SCOPE
Scopes.NO_SCOPE
可以作为测试时进行模拟时一个实例的作用范围以方便测试。
下篇: