Spring mvc:软件架构的最佳实践

时间:2017-06-08 13:45:06

标签: spring spring-mvc spring-ws software-design

我使用spring mvc开发其他Web服务。

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

持久层:使用@Repository注释的类

服务层:使用@Service

注释的类

控制器层:使用@Controller注释的类

对于我的情况,数据首先从一个宁静的ws(一个后端)加载然后存储到数据库中,一段时间后,我的项目从其余的ws(后端)重新加载它以刷新数据并使用它来提供一些服务。

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

感谢

1 个答案:

答案 0 :(得分:1)

根据我的理解,您的数据库是Web服务数据的某种缓存吗?

所以我会实现一些负责从WS中检索数据的@Service bean,让我们称之为“WSAccessBean”。

现在我想到了两种方法:

  1. 预先加载:您的Spring servlet将使用预定任务定期调用WSAccessBean并将检索到的数据存储在数据库中。您可以像往常一样使用@Repository bean来访问此数据。
  2. 延迟加载:您实现了另一个@Service bean,它是数据访问的外观,我们称之为“DataAccessBean”。这个将同时使用:@Repository bean来检查我们的本地数据库中是否有最新数据,如果没有,它将使用WSAccessBean首先检索数据,然后将数据从数据库返回给调用者。
  3. 评论后编辑:

    因此,如果您的数据需要按需加载,以下代码段将使用“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();
        }
    }