关于上一章绑定的内容,当遇到绑定的对象,有泛型参数时,记得使用TypeLiteral,比如说想要将Cache<String,String>绑定到实现GuiceDemoCache上,则:
bind(new TypeLiteral<Cache<String,String>>(){}).to(GuiceDemoCache.class);
1、
问题引出:
![](https://img.haomeiwen.com/i7803976/bf938174c3e37a8e.png)
默认不是同一个,requestParser不是同一个没有问题,但是数据库连接dataBaseConnection只要创建一个就可以。
![](https://img.haomeiwen.com/i7803976/405d61096cab1d1d.png)
这种情况,由Provider的get方法得到的实例,是不确定的,这是SessionScope,同一个session内,就是同一个;那如果不是同一个session,就不一样了。
2、选择作用域
<1> 默认
适用于一般实例,构造速度快,stateless(没有一些有状态的成员变量,一直都保持不变)
<2> Singleton
适用于Stateful的实例,构造速度慢的实例,必须线程安全,如:数据库连接,网络连接
<3> Session/Request
含有session/request信息的实例,stateful的实例,如SessionState等
3、如何设定作用域?
以singleton为例,
<1> 可以在对应的需要绑定的实现类上加上注解@Singleton
![](https://img.haomeiwen.com/i7803976/f7ef9954c5653637.png)
<2> 在module中
bind(new TypeLiteral<Cache<String,String>>(){})
.to(GuiceDemoCache.class)
.in(Singleton.class);
<3> 通过Provides
@Provides @Singleton Cache<String,String> getCache(){
return new GuiceDemoCache();
}
网友评论