Springの@Cacheable
注釈を非シングルトン(例えば、セッションスコープ)Beanと使い、キャッシュに前記Beanと同じスコープを持たせる簡単な方法はありますか?Springの@Cacheableアノテーションは、注釈付きメソッドのBeanと同じスコープを持つことができますか?
例:
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Scope;
import org.springframework.security.core.context.SecurityContextHolder;
@Named
@Scope("session")
public class UserNameRetriever {
@Inject private UserDao userDao;
@Cacheable("userName")
public String getUserName() {
return userDao.getUserByLogin((String)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getName();
}
}
理想的には、UserNameRetriever.getUserName()
は、セッションごとに一度UserDao
からユーザ名を取得しますが、このコードは実際にアプリケーション全体のキャッシュします。
これは)動作しますが、 ( \t \ @CacheEvict(値= "userNameに" なしのメモリリーク、キー= "#1 root.target" を有する \t \ @PreDestroy \t公共ボイドクリーンアップ(){ \t} ) また、@Cacheableを使用しないことに決めました。なぜなら、値が一度だけ計算されることを保証するものではないからです。 –
メモリリークの意味は?キャッシュが大きすぎます。 @Cacheableはまずキャッシュ内を検索するので、キャッシュ内にまだ値が計算されないことが保証されます。 – sinuhepop
セッションが終了すると、値はキャッシュに残っていますが、アクセスできなくなるため、メモリリークです。 @PreDestroyは、セッションが終了したときにキャッシュされた値が確実に追い出されるようにします。 –