识别 Spring MVC 架构模式
Identifying Spring MVC architecture pattern
我正在制作一个 spring mvc 视频系列并且喜欢它!
我想详细了解正在使用的确切架构的细节,但在确定正确的 名称 时遇到了困难 - 以便我可以进一步阅读。
例如,我知道表示层是 MVC,但不确定您将如何更具体地描述模式来说明服务和资源对象的使用 -而不是选择使用服务、DAO 和域对象。
有什么线索可以帮助我更好地将搜索重点放在理解下面的布局上吗?
application
core
models/entities
services
rest
controllers
resources
resource_assemblers
编辑:
Nathan Hughes 的评论澄清了我对命名法的困惑,SirKometa 将我没有掌握的架构点联系起来。谢谢你们。
我猜您正在寻找的架构模式是表述性状态转移 (REST)。你可以在这里阅读它:
http://en.wikipedia.org/wiki/Representational_state_transfer
在 REST 中,传递的数据称为资源:
Identification of resources:
Individual resources are identified in requests, for example using URIs in web-based REST systems. The resources themselves are conceptually separate from the representations that are returned to the client. For example, the server may send data from its database as HTML, XML or JSON, none of which are the server's internal representation, and it is the same one resource regardless.
据我所知,您提到的布局代表了通过 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
甚至 spring-data-jpa
以及 Hibernate
作为您的 ORM 库.它很可能会引导您使用 Repository
接口(尽管您出于某种原因观看的视频的作者决定不使用它)。无论如何,它将是您访问数据库的层,例如:https://github.com/chrishenkel/spring-angularjs-tutorial-10/blob/master/src/main/java/tutorial/core/repositories/jpa/JpaAccountRepo.java
service
包将是您操作数据的包。这不是最好的例子,但这一层不直接访问您的数据库,它会使用存储库来做它,但它也可能做其他事情——它将是您的 API 来操作您应用程序中的数据。假设您想在将钱包保存到 DB 之前对其进行花哨的计算,或者像此处 https://github.com/chrishenkel/spring-angularjs-tutorial-10/blob/master/src/main/java/tutorial/core/services/impl/AccountServiceImpl.java 您想要确保您尝试创建的博客尚不存在。
controllers
包包含所有 类,DispacherServlet
将使用它们来处理请求。您将从请求中读取 "input",处理它(在此处使用您的 Services
)并发送您的回复。
resource_assemblers
包在这种情况下是特定于框架的 (Hateoas
)。据我所知,它只是您 json 响应的 DTO(例如,您可能希望将密码存储在 Account
中,但通过 json 公开它并不是一个好主意,如果你不使用 DTO,它就会发生)。
如果这就是您要找的答案,请告诉我。
This question may be of interest to you as well as this explanation.
您在每种情况下都在谈论相同的事情,Spring 只是使用注释,以便在扫描它们时知道您正在创建或实例化的对象类型。
基本上所有请求都流经用 @Controller. Each method process the request and (if needed) calls a specific service class to process the business logic. These classes are annotated with @Service 注释的控制器。控制器可以通过在@Autowire 中自动装配它们或将它们资源化@Resource 来实例化这些classes。
@Controller
@RequestMapping("/")
public class MyController {
@Resource private MyServiceLayer myServiceLayer;
@RequestMapping("/retrieveMain")
public String retrieveMain() {
String listOfSomething = myServiceLayer.getListOfSomethings();
return listOfSomething;
}
}
服务 class 然后执行其业务逻辑,如果需要,从使用 @Repository. The service layer instantiate these classes the same way, either by autowiring them in @Autowire or resourcing them @Resource 注释的存储库 class 检索数据。
@Service
public class MyServiceLayer implements MyServiceLayerService {
@Resource private MyDaoLayer myDaoLayer;
public String getListOfSomethings() {
List<String> listOfSomething = myDaoLayer.getListOfSomethings();
// Business Logic
return listOfSomething;
}
}
存储库 class 构成了 DAO,Spring 在它们上面使用了 @Repository 注释。实体是由@Repository 层接收的单个class 对象。
@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 知道它正在实例化什么类型的对象 and/or 如何包含另一个 class .
我正在制作一个 spring mvc 视频系列并且喜欢它!
我想详细了解正在使用的确切架构的细节,但在确定正确的 名称 时遇到了困难 - 以便我可以进一步阅读。
例如,我知道表示层是 MVC,但不确定您将如何更具体地描述模式来说明服务和资源对象的使用 -而不是选择使用服务、DAO 和域对象。
有什么线索可以帮助我更好地将搜索重点放在理解下面的布局上吗?
application
core
models/entities
services
rest
controllers
resources
resource_assemblers
编辑: Nathan Hughes 的评论澄清了我对命名法的困惑,SirKometa 将我没有掌握的架构点联系起来。谢谢你们。
我猜您正在寻找的架构模式是表述性状态转移 (REST)。你可以在这里阅读它:
http://en.wikipedia.org/wiki/Representational_state_transfer
在 REST 中,传递的数据称为资源:
Identification of resources: Individual resources are identified in requests, for example using URIs in web-based REST systems. The resources themselves are conceptually separate from the representations that are returned to the client. For example, the server may send data from its database as HTML, XML or JSON, none of which are the server's internal representation, and it is the same one resource regardless.
据我所知,您提到的布局代表了通过 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
甚至spring-data-jpa
以及Hibernate
作为您的 ORM 库.它很可能会引导您使用Repository
接口(尽管您出于某种原因观看的视频的作者决定不使用它)。无论如何,它将是您访问数据库的层,例如:https://github.com/chrishenkel/spring-angularjs-tutorial-10/blob/master/src/main/java/tutorial/core/repositories/jpa/JpaAccountRepo.javaservice
包将是您操作数据的包。这不是最好的例子,但这一层不直接访问您的数据库,它会使用存储库来做它,但它也可能做其他事情——它将是您的 API 来操作您应用程序中的数据。假设您想在将钱包保存到 DB 之前对其进行花哨的计算,或者像此处 https://github.com/chrishenkel/spring-angularjs-tutorial-10/blob/master/src/main/java/tutorial/core/services/impl/AccountServiceImpl.java 您想要确保您尝试创建的博客尚不存在。controllers
包包含所有 类,DispacherServlet
将使用它们来处理请求。您将从请求中读取 "input",处理它(在此处使用您的Services
)并发送您的回复。resource_assemblers
包在这种情况下是特定于框架的 (Hateoas
)。据我所知,它只是您 json 响应的 DTO(例如,您可能希望将密码存储在Account
中,但通过 json 公开它并不是一个好主意,如果你不使用 DTO,它就会发生)。
如果这就是您要找的答案,请告诉我。
This question may be of interest to you as well as this explanation.
您在每种情况下都在谈论相同的事情,Spring 只是使用注释,以便在扫描它们时知道您正在创建或实例化的对象类型。
基本上所有请求都流经用 @Controller. Each method process the request and (if needed) calls a specific service class to process the business logic. These classes are annotated with @Service 注释的控制器。控制器可以通过在@Autowire 中自动装配它们或将它们资源化@Resource 来实例化这些classes。
@Controller
@RequestMapping("/")
public class MyController {
@Resource private MyServiceLayer myServiceLayer;
@RequestMapping("/retrieveMain")
public String retrieveMain() {
String listOfSomething = myServiceLayer.getListOfSomethings();
return listOfSomething;
}
}
服务 class 然后执行其业务逻辑,如果需要,从使用 @Repository. The service layer instantiate these classes the same way, either by autowiring them in @Autowire or resourcing them @Resource 注释的存储库 class 检索数据。
@Service
public class MyServiceLayer implements MyServiceLayerService {
@Resource private MyDaoLayer myDaoLayer;
public String getListOfSomethings() {
List<String> listOfSomething = myDaoLayer.getListOfSomethings();
// Business Logic
return listOfSomething;
}
}
存储库 class 构成了 DAO,Spring 在它们上面使用了 @Repository 注释。实体是由@Repository 层接收的单个class 对象。
@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 知道它正在实例化什么类型的对象 and/or 如何包含另一个 class .