在多个控制器中重用服务层调用的结果

时间:2017-07-12 19:28:35

标签: java spring

我正在申请春季申请。以下是场景。 我在一个类中有多个控制器,如下面的代码所示。我在两个控制器中使用相同的服务调用。是否有一种方法可以进行一次服务调用,结果用于多个控制器< /强>

    @RequestMapping(value = "/details", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List<String> detailData() throws Exception {
            List<MyDTO> results = myService.detailData();
            //business logic
    }   

    @RequestMapping(value = "/detailsMontly", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
        public
        @ResponseBody List<String> montlyDetailData() throws Exception {
        List<MyDTO> results = myService.detailData();
        //business logic
    }

在上面的代码中,List<MyDTO> results = myService.detailData();在两个控制器中被调用,不必要两次,我正在点击服务层,而服务层又会访问数据库。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

是的,请看一下这一章:Cache Abstraction

TLDR; 您需要:

  1. 使用@Cacheable注释
  2. 标记您的服务方法
  3. 确保使用@EnableCaching
  4. 注释应用程序配置
  5. 配置CacheManager bean
  6. 的一个可用实现

答案 1 :(得分:1)

在给定的请求上下文中,只有一次调用服务方法myService.detailData()。您在此处显示的两种方法中的每一种都映射到不同的URL模式。因此,在给定的请求上下文中,只有一次调用您的服务。

但是,如果myService.detailData从数据库中检索静态数据,因此在请求中是通用的,则可以将其存储在静态变量中。做类似下面的事情:

private static List<MyDTO> results = null;

@ModelAttribute("results")
public List<MyDTO> getResults() {
    if (results == null) {
        results = myService.detailData;
    }
    return results;
}