springboot 项目架构(分层结构)
转载:https://www.bilibili.com/read/cv17836595/
1 MVC设计模式
模型-视图-控制器(MVC)是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,改设计模式在Java项目中被大量使用,甚至被很多前端框架吸收应用。
M即model模型,是指模型表示业务规则。在JavaEE项目modle被命名为Service
V即View视图,是指用户看到并与之交互的界面。比如本课程Vue,就是视图层框架
C即controller控制器,是指控制器接受用户的输入并调用模型和视图去完成用户的需求。
注意!控制器本身不处理逻辑。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。
在Java早期项目中,JSP+Servlet+JavaBean 这种模式即就是典型的MVC模式:
- JSP负责人机交互(view)
- Servlet负责流程控制(controller)
- JavaBean负责业务逻辑(model)
编写Servlet比较麻烦,随后开始出现MVC框架,比如Struts1,Struts2,SpringMvc等
MVC模式对架构设计影响巨大,不但在JavaEE项目中大量使用,比如Swing中也有对应实现。此外,前端目前流行的MVVM双向绑定也可以看作是一种MVC模式.
通常我们将控制器单独分包作为一层,命名为controller。此外该包的控制器类命名也建议加上Controller,如前面的CategoryController。
2 DAO设计模式
DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口。(DAO层就是mapper层,里面封装的是对数据库的操作逻辑CURD,pojo相当于entity,一个简单类,对应数据库中的一张表包含getter和setter方法),pojo命名规范参考:https://www.cnblogs.com/liyuanhong/articles/17370251.html
DAO对同一张表的所有操作封装在xxxDaoImpl对象中。根据增删改查的不同功能实现具体的方法(insert,update,delete,selsect,selctAll)
在JavaEE项目中,开发人员使用DAO设计模式把底层的数据访问逻辑和高层的业务逻辑分开,这样可以使业务逻辑和数据库操作都保持高内聚度,提高可重用性和扩展性。
DAO模式实现可直接对jdbc进行封装,也可以使用对象关系映射框架,如Hibernate、Mybatis等。
3 SpringBoot项目分层
3.1 架构分层
从逻辑架构上,一个系统可以简单划分为3层。
根据视图模型分离原则,不会让视图层和业务逻辑层耦合在一次,而是设计MVC模式实现分离。即在View和Service层之间加入Controller,从而实现了MVC架构。
当然,通常不建议在Servcie层直接操作数据库,即将业务逻辑和SQL语句混在一起。因此会采用DAO设计模式。
新建dao层。每张表对应一个dao对象,由dao对象对数据库表进行CRUD操作。Service只依赖dao
因此如果在SpringBoot项目中同时应用到MVC模式和DAO模式,则系统的三层逻辑架构就成为了五层架构。即view视图层 /controller控制层/service服务层/persistence持久层/db数据库层。
pringBoot框架一般分为View层、Controller层、Service层、Mapper层、pojo(entity)层。
View层:视图层,根据接到的数据展示页面给用户
Controller层:响应用户需求,决定用什么视图,需要准备什么数据来显示。Controller层负责前后端交互,接收前端请求,调用Service层,接收Service层返回的数据,最后返回具体的数据和页面到客户端
Service层:Service层也可以分为三个方面
(1)接口:用来声明方法
(2)继承实现接口
(3)impl:接口的实现(将mapper和service进行整合的文件)
Service层存放业务逻辑处理,有一些关于数据库处理的操作,但是不是直接和数据库打交道,有接口,也有接口的实现方法,在impl实现接口类中需要导入mapper类,mapper层是直接与数据库进行操作的。
4. Mapper层:也可以称为DAO层,是数据库CRUD的接口,只有方法名,具体实现在mapper.xml文件中,对数据库进行数据持久化操作(把数据放到持久化的介质中,同时提供CRUD操作)
5. src/main/resource文件夹中的mapper.xml文件,里面存储的是真正的数据库CRUD语句
6. Pojo(entity)层:存放实体类,与数据库中的属性基本保持一致,一般包括getter、setter、toString方法(未使用插件lombok的情况下)。有的开发写成pojo,有的写成model,也有domain,也有dto。