2013-05-21 40 views
0

我是Guice的新手,对缓存有疑问。Guice:我如何缓存数据

我有一个Web应用程序,它使用提供程序来提供用户配置。

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提供了一些关于此用例的更加巧妙的缓存方法吗?

非常感谢。

回答

3

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

但是,如果您不使用标准servlet会话,而是自定义某些东西,那么您还需要创建custom scope