是否有一种简单的方法可以将 Spring 的@Cacheable
注释与非单例(例如会话范围)bean 一起使用,并使缓存具有与所述 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
每个会话一次中获取用户名,但此代码实际上在应用程序范围内缓存。