0

我是新手,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提供了一些更聪明的方法来缓存这个用例?

非常感谢。

4

1 回答 1

3

如果您使用的是标准 servlet 会话,那么使用ServletScopes.SESSIONscope 而不是ServletScopes.REQUEST. 在这种情况下,每个会话应该只创建一次注入的对象。

但是,如果您使用的不是标准 servlet 会话而是自定义的,那么您还需要创建自定义范围

于 2013-05-21T13:34:47.867 回答