我是Guice
的新手并且有关于缓存的问题。
我有一个WebApp,它使用提供程序来提供用户配置。
bind(UserConfiguration.class).toProvider(UserConfigurationProvider.class).in(ServletScopes.REQUEST);
提供者声明为:
public class UserConfigurationProvider implements Provider<UserConfiguration>{
public UserConfiguration get() {
userConfigurationDatabase.getUserConfiguration(<some param here>);
}
}
在get方法中,它会调用DB
并进行非常昂贵的DB
调用。
我有许多类UserConfiguration
注入如下:
public class PriceView {
private UserConfiguration userConfiguration;
@Inject
public MyClass(UserConguration userConfiguration){
this.userConfiguration = userConfiguration;
}
.....
}
public class OrderView {
private UserConfiguration userConfiguration;
@Inject
public MyClass(UserConguration userConfiguration){
this.userConfiguration = userConfiguration;
}
........
}
问题在于,每次切换视图时,都会创建一个新的xxxxView对象,因此会注入一个新的UserConfiguration
,因此会调用昂贵的DB
调用。
我希望每个用户登录时调用DB
一次。我的想法是在用户登录时将UserConfiguration
缓存到某个地方,并在用户注销后将其清除或过期。
但我想知道,Guice
为这个用例提供了哪些更聪明的缓存方法?
非常感谢。
答案 0 :(得分:3)
如果您正在使用标准servlet会话,那么使用ServletScopes.SESSION
范围而不是ServletScopes.REQUEST
就足够了。在这种情况下,每个会话只应创建一次注入的对象。
但是,如果您没有使用标准servlet会话而是自定义,那么您还需要创建custom scope。