如何在其他控制器中使用spring @cacheable访问缓存的值?

时间:2017-08-03 13:03:51

标签: spring spring-mvc caching

我有一个频繁访问但体积庞大的值 - valueA,它是通过方法 - 休息控制器的方法A - ControllerA获得的。所以我使用@Cacheable注释缓存了这个值,如下所示。

    @CacheConfig(cacheNames={"abc_cache"})
    public class ControllerA
{

    @Cacheable
    @RequestMapping(value = "/value/" , method=RequestMethod.GET)
    public ResponseEntity<Value> fetchValue()
    {
       // some logic
       return new ResponseEntity<Value>(value, HttpStatus.OK);
    }
}

我想在另一个方法中访问此值 - 另一个控制器的methodB - controllerB。 如何访问此值?

2 个答案:

答案 0 :(得分:3)

您可以使用其他类/ bean来提供该值。然后,您可以在所有您想要的控制器中注入该bean。

这样的事情:

@Component
public class MyValueService {
    @Cacheable
    public Value getValue() {
        return ...;
    }
}

然后在控制器中

public class ControllerA
{
    @Autowired
    private MyValueService valServ;

    @RequestMapping(value = "/value/" , method=RequestMethod.GET)
    public ResponseEntity<Value> fetchValue()
    {
       return new ResponseEntity<Value>(valServ.getValue(), HttpStatus.OK);
    }
}

您是否了解控制器 - &gt;服务 - &gt;存储库模式?

基本上:

控制器是Web图层。他们处理http请求。他们使用服务。

服务负责应用程序的业务逻辑。他们使用存储库。

Repositori es负责数据访问 - 数据库访问,文件系统读/写等。

您应该以这种方式构建应用程序。

一般情况下,我会在Repository层使用缓存。通常瓶颈是I / O操作(读/写文件系统,DB调用,通过网络调用外部服务),如果可能的话,那就是你要缓存的东西。

答案 1 :(得分:2)

我认为你应该将可缓存的逻辑封装到另一个类的方法中,然后从两个控制器中调用它。

所以

public class ControllerA
{

    @Resource
    private Service service;

    @RequestMapping(value = "/value/" , method=RequestMethod.GET)
    public ResponseEntity<Value> fetchValue()
    {
       // some logic
       Object v = service.cachedMethod();
       return new ResponseEntity<Object>(v, HttpStatus.OK);
    }
}

@Component
public class Service {

    @Cacheable
    public Object cachedMethod() {... }

}