Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringMVC:软件架构的最佳选择_Spring_Spring Mvc_Spring Ws_Software Design - Fatal编程技术网

SpringMVC:软件架构的最佳选择

SpringMVC:软件架构的最佳选择,spring,spring-mvc,spring-ws,software-design,Spring,Spring Mvc,Spring Ws,Software Design,我使用SpringMVC开发RESTWeb服务 我知道应用程序应该包含3层: 持久层:用@Repository注释的类 服务层:用@service注释的类 控制器层:用@controller注释的类 在我的例子中,数据首先从restful ws(后端)加载,然后存储到数据库中,经过一段时间后,我的项目从rest ws(后端)重新加载数据以刷新数据并使用它提供一些服务 那么调用后端ws的java类应该用@Service注释? 然后直接从控制器调用? 在这种情况下,如何安排项目架构? 它的体系结构是

我使用SpringMVC开发RESTWeb服务

我知道应用程序应该包含3层:

持久层:用@Repository注释的类

服务层:用@service注释的类

控制器层:用@controller注释的类

在我的例子中,数据首先从restful ws(后端)加载,然后存储到数据库中,经过一段时间后,我的项目从rest ws(后端)重新加载数据以刷新数据并使用它提供一些服务

那么调用后端ws的java类应该用@Service注释? 然后直接从控制器调用? 在这种情况下,如何安排项目架构? 它的体系结构是否与使用数据库数据的体系结构相同


谢谢

据我所知,您的数据库是Web服务数据的某种缓存,对吗

因此,我将实现一些@servicebean,它们负责从WS检索数据,我们称之为“WSAccessBean”

现在我想到了两种方法:

  • 急切加载:SpringServlet将使用计划任务定期调用WSAccessBean并将检索到的数据存储在数据库中。您的控制器bean将像往常一样使用@Repository bean来访问此数据
  • 延迟加载:您实现了另一个@servicebean,它是数据访问的门面,我们称之为“DataAccessBean”。这一个将同时使用:@Repository bean来检查本地数据库中是否有最新的数据,如果没有,它将使用WSAccessBean首先检索数据,然后将数据从数据库返回给调用者
  • 评论后编辑:

    因此,如果您的数据需要按需加载,以下代码段将以“Book”POJO为例显示基本架构:

    @Service
    public class BookWebservice {
        // Load books from remote webservice
        List<Book> retrieveBooks();
    }
    
    @Repository
    public class BookDAO {
        List<Book> getBooks();
        void storeBooks(List<Book> books);
        boolean uptodate();
    }
    
    @Service
    public class BookService {
    
        @Autowired
        BookDAO bookDAO;
    
        @Autowired
        BookWebservice bookWebservice;
    
        // Checks if local data is up-to-date. If not load via Webservice and store in the local DB, then return content from DB
        List<Book> getBooks() {
    
            if (!bookDAO.uptodate()) {
                bookDAO.storeBooks(bookWebservice.retrieveBooks());
            }
            return bookDAO.getBooks();
        }
    }
    
    @Controller
    public class BookController {
    
        @Autowired
        BookService bookService;
    
        @GetMapping("/books")
        public List<Book> books() {
            return bookService.getBooks();
        }
    }
    
    @服务
    公共类BookWebservice{
    //从远程Web服务加载书籍
    列出检索书籍();
    }
    @存储库
    公共类藏书刀{
    列出getBooks();
    作废库房(清单册);
    布尔更新();
    }
    @服务
    公共类图书服务{
    @自动连线
    书刀书刀;
    @自动连线
    BookWebservice BookWebservice;
    //检查本地数据是否是最新的。如果不是通过Webservice加载并存储在本地数据库中,则从数据库返回内容
    列出getBooks(){
    如果(!bookDAO.uptodate()){
    bookDAO.storeBooks(bookWebservice.retrieveBooks());
    }
    返回bookDAO.getBooks();
    }
    }
    @控制器
    公共类图书管理员{
    @自动连线
    图书服务;
    @GetMapping(“/books”)
    公共图书目录(){
    return bookService.getBooks();
    }
    }
    
    关于固定期限和到期日等问题,您的问题不是很清楚。您是说您的rest服务正在调用另一个rest服务,所以您对体系结构感到困惑?谢谢andreas。没有定期电话。数据被缓存到数据库中,当调用者发送请求时,我的应用程序会在数据库中查找数据,如果数据过期,它会从WS。因此,第二个建议“延迟加载”对于我的应用程序来说更合适