Guice:我如何缓存数据

时间:2013-05-21 10:39:49

标签: java web-applications guice

我是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为这个用例提供了哪些更聪明的缓存方法?

非常感谢。

1 个答案:

答案 0 :(得分:3)

如果您正在使用标准servlet会话,那么使用ServletScopes.SESSION范围而不是ServletScopes.REQUEST就足够了。在这种情况下,每个会话只应创建一次注入的对象。

但是,如果您没有使用标准servlet会话而是自定义,那么您还需要创建custom scope