2013-05-21 6 views
0

저는 Guice을 처음 사용하고 캐싱과 관련하여 질문이 있습니다.Guice : 어떻게 데이터를 캐시 할 수 있습니까?

사용자 구성을 제공하기 위해 제공자를 사용하는 웹 애플리케이션이 있습니다. get 메소드에서

public class UserConfigurationProvider implements Provider<UserConfiguration>{ 
    public UserConfiguration get() { 
     userConfigurationDatabase.getUserConfiguration(<some param here>); 
    } 
} 

, 그것은 DB를 호출하고 매우 비싼 DB 전화를 걸 :
bind(UserConfiguration.class).toProvider(UserConfigurationProvider.class).in(ServletScopes.REQUEST); 

공급자

는 다음과 같이 선언한다. 따라서

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; 
    } 
    ........ 
} 

문제 I가 뷰를 전환 할 때마다 새로운 xxxxView 오브젝트가 작성되어 있는지, 따라서 새로운 UserConfiguration가 주입되고 :

난 유사한 주입 UserConfiguration 얻을 클래스 번호를 가지고 비싼 DB 호출이 호출됩니다.

나는 사용자 로그인 당 한 번 DB으로 전화를 걸고 싶습니다. 내 생각은 사용자가 로그인하고 사용자가 로그 아웃하거나 만료 한 후에 캐시 할 때 어딘가에 UserConfiguration을 캐시하는 것입니다.

하지만 whehter를 알고 싶습니다. Guice은이 유스 케이스에 대해 더 영리하게 캐싱하는 방법을 제공합니까?

감사합니다.

답변

3

표준 서블릿 세션을 사용하는 경우 ServletScopes.REQUEST 대신 ServletScopes.SESSION 범위를 사용하면 충분합니다. 이 경우 삽입 된 객체는 세션 당 한 번만 만들어야합니다.

그러나 표준 서블릿 세션을 사용하고 있지 않지만 사용자 지정 사항을 사용하는 경우 custom scope을 만들어야합니다.

관련 문제