是否有一种简单的方法可以将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")

10-04 14:09