我有一个频繁访问但体积庞大的值 - 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。 如何访问此值?
答案 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() {... }
}