是否有一种简单的方法可以将Spring的@Cacheable
注释与非单个(例如, session 范围的)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();
}
}
理想情况下,每个 session 一次,
UserNameRetriever.getUserName()
将从UserDao
获取用户名,但是该代码实际上缓存了整个应用程序。 最佳答案
我还没有尝试过,但是根据Spring reference,我认为这可以工作:
@Cacheable(value = "userName", key = "#root.target")