我正在通过一个春季mvc视频系列并且喜欢它!
我想了解更多有关正在使用的确切架构的细节,并且无法确定正确的名称 - 以便我可以进一步阅读。
例如,我理解表示层是MVC,但不确定如何更具体地描述模式来考虑使用服务和资源对象 - 而不是选择使用服务,DAO和Domain对象。
有哪些线索可以帮助我更好地专注于理解下面的布局?
application
core
models/entities
services
rest
controllers
resources
resource_assemblers
修改 Nathan Hughes的评论澄清了我与命名法的混淆,SirKometa连接了我没有掌握的建筑点。多谢你们。
答案 0 :(得分:4)
据我所知,您提到的布局代表了通过REST服务与世界通信的应用程序。
core
package表示与视图无关的所有类(域,服务,存储库)。 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
包将是您操作数据的包。这不是最好的例子,但是这个层不会直接访问你的数据库,它会使用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。 如果这是您正在寻找的答案,请告诉我。
答案 1 :(得分:2)
This question可能对您和this explanation感兴趣。
在每种情况下,你大多都在谈论相同的事情,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知道它实例化的对象类型和/或如何包含另一个类。
答案 2 :(得分:0)
我想您正在寻找的架构模式是 Representational State Transfer(REST)。你可以在这里阅读:
http://en.wikipedia.org/wiki/Representational_state_transfer
在REST中,传递的数据称为资源:
资源识别: 在请求中标识单个资源,例如在基于Web的REST系统中使用URI。资源本身在概念上与返回给客户端的表示分开。例如,服务器可以从其数据库发送数据,如HTML,XML或JSON,其中没有一个是服务器的内部表示,并且它是相同的一个资源。