识别Spring MVC架构模式

5
我正在学习一套关于Spring MVC的视频教程,非常喜欢它! 我希望了解正在使用的确切架构细节,但很难确定正确的名称,以便我可以进一步阅读。
例如,我了解表示层是MVC,但不太确定如何更具体地描述该模式,以考虑使用服务和资源对象,而不是选择使用服务、DAO和域对象。
有什么线索可以帮助我更好地集中精力理解下面的布局吗?
application
  core
     models/entities
     services
  rest
     controllers
     resources
        resource_assemblers

编辑: Nathan Hughes的评论澄清了我对术语的困惑,而SirKometa则连接了我没有理解的建筑点。谢谢大家。


你能详细说明一下你所说的“描述模式以解决使用服务和资源对象的问题 - 而不是选择使用服务、DAO和域对象”吗?在Spring中,仍然需要使用服务、DAO和域对象。 - Shaggy
我想我正在努力更好地理解不同的命名方案。我看到有些人提到实体和DAO,而其他人则使用诸如存储库或资源之类的名称。似乎有不同的方法来描述DAL的各种实现以及“中间”层的不同名称 - 即业务层,服务层。 - BranLakes
Spring框架采用了领域驱动设计模式术语。有些人使用J2EE模式书中的术语,而有些人则使用Evans的DDD书中的术语。 - Nathan Hughes
Nathan,那正是我在寻找的方向。您提到的 DDD 和 Core J2EE 设计模式书籍简要查阅后,看起来我所见过的实现都是基于这两个派别之一。我想这两本书是与 spring mvc 相关性较高的两本有影响力的模式书籍之一? - BranLakes
除了GoF,当然还有。值得庆幸的是,大部分Core J2EE Patterns已经过时了。顺便说一下,你可以在用户名前面添加@符号(或者只添加用户名的第一部分),以便通知某人你正在评论他们。 - Nathan Hughes
3个回答

4
据我所知,你提到的布局代表着通过REST服务与世界通信的应用程序。
- `core` 包代表所有与视图无关的类(领域、服务、存储库)。 - `model` 包 - 假设你的目标是典型的应用程序,你会有一个表示数据的 `model/domain/entity` 包。例如:https://github.com/chrishenkel/spring-angularjs-tutorial-10/blob/master/src/main/java/tutorial/core/models/entities/Account.java。 - `repository` 包 - 由于你使用的是 Spring,你很可能也会使用 `spring-data` 或甚至带有 `Hibernate` 的 `spring-data-jpa`。这很可能会导致你使用 `Repository` 接口(你观看的视频作者出于某种原因决定不使用它)。无论如何,这将是访问数据库的层,例如:https://github.com/chrishenkel/spring-angularjs-tutorial-10/blob/master/src/main/java/tutorial/core/repositories/jpa/JpaAccountRepo.java。 - `service` 包将是操作数据的包。这不是最好的例子,但这一层不会直接访问你的数据库,它会使用 Repositories 来完成,但它也可能做其他事情——这将是你在应用程序中操作数据的 API。比如说,你想在保存钱包之前进行花哨的计算,或者像这里https://github.com/chrishenkel/spring-angularjs-tutorial-10/blob/master/src/main/java/tutorial/core/services/impl/AccountServiceImpl.java一样,你想确保你尝试创建的博客还不存在。 - `controllers` 包包含所有将由 `DispacherServlet` 使用的类来处理请求。你将从请求中读取“输入”,处理它(在此处使用你的 `Services`),并发送响应。 - `resource_assemblers` 包在这种情况下是特定于框架的(`Hateoas`)。据我所知,它只是你的 JSON 响应的 DTO(例如,你可能想在你的 `Account` 中存储密码,但通过 JSON 公开它不是个好主意,如果你不使用 DTO,就会发生这种情况)。
请告诉我这是否是你要找的答案。

谢谢 SirKometa。这样解释很清楚了。您可能会感兴趣的是,您说得很对 - 这个系列的作者确实会回过头来使用存储库包。 - BranLakes

2

这个问题可能对您有兴趣,以及这个解释

在每种情况下,您大多数谈论的是相同的事情,Spring只是使用注释来扫描它们,以知道您正在创建或实例化哪种类型的对象。

基本上,所有请求都通过使用@Controller注释的控制器流动。每个方法处理请求,并(如果需要)调用特定的服务类来处理业务逻辑。这些类使用@Service进行注释。控制器可以通过@Autowire自动连接这些类或@Resource资源它们。

@Controller
@RequestMapping("/")
public class MyController {

    @Resource private MyServiceLayer myServiceLayer;

    @RequestMapping("/retrieveMain")
    public String retrieveMain() {

        String listOfSomething = myServiceLayer.getListOfSomethings();
        return listOfSomething;
    }
}

服务类然后执行它们的业务逻辑,如果需要,从一个带有@Repository注释的存储库类中检索数据。服务层以相同的方式实例化这些类,可以通过自动装配@Autowire或资源化@Resource来实现。
@Service
public class MyServiceLayer implements MyServiceLayerService {

    @Resource private MyDaoLayer myDaoLayer;

    public String getListOfSomethings() {

        List<String> listOfSomething = myDaoLayer.getListOfSomethings();
        // Business Logic
        return listOfSomething;
    }
}

仓库类构成了DAO,Spring在它们上面使用@Repository注解。实体是由@Repository层接收的单个类对象。
@Repository
public class MyDaoLayer implements MyDaoLayerInterface {

    @Resource private JdbcTemplate jdbcTemplate;

    public List<String> getListOfSomethings() {

        // retrieve list from database, process with row mapper, object mapper, etc.
        return listOfSomething;
    }
}

@Repository、@Service 和 @Controller 是 @Component 的具体实例。所有这些层都可以用 @Component 进行注释,但最好使用真正代表它的名称进行注释。
因此,它们的意思相同,只是用于让Spring知道正在实例化的对象的类型和/或如何包含另一个类的注释不同。

谢谢Shaggy。我很感激你花费的时间和精力编写这个解释。它为我阐明了通用架构对象与Spring框架的联系。 - BranLakes

0

我猜你正在寻找的架构模式是表现层状态转移(REST)。你可以在这里阅读相关内容:

http://en.wikipedia.org/wiki/Representational_state_transfer

在REST中,传递的数据被称为资源:

资源的识别: 请求中识别单个资源,例如在基于Web的REST系统中使用URI。资源本身在概念上与返回给客户端的表示分开。例如,服务器可以将其数据库中的数据以HTML、XML或JSON形式发送,但这些都不是服务器的内部表示,它仍然是同一资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接