Spring Boot & Spring MVC 分层模型 注解

616 阅读14分钟

Spring Boot & Spring MVC 分层模型 注解

使用spring-boot-starter-web实现SpringMVC的自动化配置

接口列表:

请求方法URL功能
GET/users查询用户列表
GET/users/{id}获得指定用户编号的用户
POST/users添加用户
PUT/users/{id}更新指定用户编号的用户
DELETE/users/{id}删除指定用户编号的用户

注解

  1. @Controller :表示是控制器对象
    • 属性name:该Controller对象的Bean名字,可为空
  2. @RestController:是@Controller和@ResponseBody的组合注解
    • 直接使用接口方法的返回结果,经过 JSON/XML 等序列化方式,最终返回
  3. @RequestMapping:标记该类/方法对应接口的配置信息
    • 属性path:接口路径。[ ]数组,可以填写多个接口路径。
    • 属性values 属性:和 path 属性相同,是它的别名。
    • 属性method 属性:请求方法 RequestMethod ,可以填写 GETPOSTPOSTDELETE 等等。[] 数组,可以填写多个请求方法。如果为空,表示匹配所有请求方法
    • 不常用属性
      • name 属性:接口名。一般情况下,我们不填写。
      • params 属性:请求参数需要包含值的参数名。可以填写多个参数名。如果为空,表示匹配所有请你求方法。
      • headers 属性:和 params 类似,只是从参数名变成请求头
      • consumes 属性:和 params 类似,只是从参数名变成请求头的提交内容类型Content-Type )
      • produces 属性:和 params 类似,只是从参数名变成请求头的( Accept )可接受类型
    • Spring给每种请求方法提供了注解
      • @GetMapping 注解:对应 @GET 请求方法的 @RequestMapping 注解。
      • @PostMapping 注解:对应 @POST 请求方法的 @RequestMapping 注解。
      • @PutMapping 注解:对应 @PUT 请求方法的 @RequestMapping 注解。
      • @DeleteMapping 注解:对应 @DELETE 请求方法的 @RequestMapping 注解。
      • ……
  4. @RequestParam:添加在方法参数上,标记该方法对应的请求参数的信息
    • name 属性:对应的请求参数名。如果为空,则直接使用方法上的参数变量名。
    • value 属性:和 name 属性相同,是它的别名。
    • required 属性:参数是否必须传。默认为 true ,表示必传。
    • defaultValue 属性:参数默认值
  5. @PathVariable:添加在方法参数上,标记接口路径和方法参数的关系
    • 相比 @RequestParam 注解,少一个 defaultValue 属性。

引入依赖

<!-- 实现对 Spring MVC 的自动化配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
<!-- 方便等会写单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

为什么要分各种层

MVC

  • 一开始接触的MVC架构(Model(模型)-View(视图)-Controller(控制器)),三个层次,即把用户视图业务处理隔离开,并通过控制器连接起来image.png实现了 表现和逻辑的解耦

表现层、表现层、数据访问层

  • 另一种常见的分层方式:表现层表现层数据访问层
    • 表现层,就是展示数据结果和接受用户指令的,是最靠近用户的一层;
    • 逻辑层里面有复杂业务的具体实现;
    • 数据访问层则是主要处理和存储之间的交互。 平时我们构建项目的Web、Service 和 Dao,它们分别对应了表现层、逻辑层还有数据访问层image.png
  • 当业务复杂时,层次之间的边界就会变得越来越模糊,参考《阿里巴巴 Java 开发手册 v1.4.0(详尽版)》,此时可以将三层架构细化成下图所示image.png每一层的作用
    • 终端显示层:各端模板渲染并执行显示的层。当前主要是 Velocity 渲染,JS 渲染, JSP 渲染,移动端展示等。
    • 开放接口层:将 Service 层方法封装成开放接口,同时进行网关安全控制和流量控制等。
    • Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
    • Service 层:业务逻辑层。
    • Manager 层:通用业务处理层。这一层主要有两个作用:
      • 其一,你可以将原先 Service 层的一些通用能力下沉到这一层,比如 与缓存和存储交互策略,中间件的接入;
      • 其二,你也可以在这一层 封装对第三方接口的调用,比如调用支付服务,调用审核服务等
    • DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase 等进行数据交互。
    • 外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口。 在这个分层架构中 主要增加了 Manager 层,它与 Service 层的关系是:Manager 层提供原子的服务接口,Service 层负责依据业务逻辑来编排原子接口

java开发中的各种层

介绍

  • 5个层次
    • 层次关系image.png
    • 命名规范image.png

1. DAO层(持久层、数据访问层)

  • 定义:dao即使data access object,主要负责处理数据库操作;
  • 功能:
    • 只负责与数据库的数据进行交互,dao层是在Mybatis框架(什么是Mybaits?1什么是Mybaits?2)下通过@MyBatisDao连接后台代码与数据库的。@Repository用于标注数据访问组件Dao层。
    • DAO层首先会创建DAO接口,然后会在配置文件中定义该接口的实现类,接着就可以在模块中就可以调用DAO 的接口进行数据业务的而处理。
    • Dao层用来访问数据库实现数据的持久化(把内存中的数据永久保存到硬盘中)。(star:dao接口查询数据后持久化,service业务层实现dao接口,调用dao接口数据)

2. Controller层(控制层、action层)

  • 功能:控制业务逻辑Controller层负责具体的业务模块流程的控制,controller层主要调用Service层里面的接口控制具体的业务流程,控制的配置也需要在配置文件中进行。
  • action层(controller层)与service关系
    • Action是管理业务(Service)调度和管理跳转的。
    • Service是管理具体的功能的。
    • Action只负责管理,而Service负责实施。

3. service层(业务层、biz)

  • 功能:
    • Service层用于实现操作的具体方法,包含了对页面操作模块的代码。
    • Service用于存放业务逻辑处理,不直接和数据库打交道,为controller层提供方法接口,Service层不仅有接口也有接口的实现方法,接口的实现方法在impl文件里。
  • biz的意思是:business层,负责整个应用程序的相关业务流程,并用代码实现出来;

4. entity层(实体层、domain层)

  • 功能:
    • entity层用于定义实体,定义各个属性以及各个属性的getter()和setter()方法。
    • 实体层,用于存放实体类,与数据库中的属性值基本保持一致,实现setter()和getter()方法。

5. view层

  • 功能:
    • 此层与Controller层联系紧密,需要协同开发。view层主要负责前台jsp页面的表示
    • 注:Dao层,Service层这两个层都可以单独开发,互相的耦合度很低,完全可以独立进行,这样的一种模式在开发大项目的过程中尤其有优势。Controller,View层因为耦合度比较高,因而要结合在一起开发,但是也可以看作一个整体独立于前两个层进行开发。这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,一切显得非常清晰简单。

web

  • 即是前台网页处理的后台代码,负责把从数据库中处理过的数据,通过web层处理之后,显示成html代码的部分。

util

  • 定义:util,即utility,工具辅助层,一组通用的代码集合,比如处理多语言功能,网站非法信息过滤等等功能的代码集

作用

entity层

  • 用于存放实体类,与数据库中的属性值基本一致,实现getter和setter方法。
  • 一般数据库一张表对应一个实体类,类属性同表字段一一对应。

DAO(Data Access Object)层(Mapper层)

  • 对数据库进行数据持久化操作,它的方法语句是直接针对数据库操作的,主要实现一些数据的增删改查
  • 核心思想是把数据库封装一下,让与数据库的交道看起来像在和一个对象打交道,这个对象通常就是DAO。当我们操作这个对象的时候,这个对象会自动产生SQL语句来和数据库进行交互,我们就只需要使用DAO就行了。
  • 通常我们在DAO层里面写接口,里面有与数据打交道的方法。
  • SQL语句通常写在mapper文件里。
  • DAO层的数据源配置以及相关的有关数据库连接的参数都在Spring配置文件中进行配置。

service层

给Controller层的类提供接口进行调用。一般就是自己写的方法封装起来,就是简单声明一下具体实现在serviceImpl中。这样我们就可以在应用中调用service接口进行业务处理。Service层业务实现,具体调用到已经定义的DAO的接口

controller层

  • 负责业务模块流程的控制。
  • 需要调用Service层的接口来控制业务流程。Controller层通过接收前端H5或者App传过来的参数进行业务操作,再将处理结果返回到前端。
  • 控制的配置同样在Spring配置文件中配置。

写法顺序

1.数据库表
2.实体层
3.DAO层写接口
4.Mapper层写和DAO层对应的映射规则,即SQL和POJO的映射规则。其中<select>元素定义的resultType指向实体层的表;
5.Service层
6.ServiceImpl
7.Controller层

Note:Service层应该既调用DAO层的接口,接收DAO层返回的数据,又要提供接口给Controller层的类来进行调用。

VO、DTO、DO、PO 理解

解释

  • VO:View Object,视图层,其作用是将指定页面的展示数据封装起来。
  • DTO:Data Transfer Object,数据传输对象
  • DO:Domain Object,领域对象
  • PO:Persistent Object,持久化对象

模型

  • 用户发出请求(填写表单),表单的数据被展示层匹配为VO
  • 展示层把VO转换为服务层对应方法所要求的DTO,提交给服务层
  • 服务层先将DTO的数据构造(或重建)一个DO,调用DO的业务方法完成具体业务
  • 服务层再将DO转换为持久层对应的PO,调用持久层的持久化方法,把PO传递持久化方法,完成持久化操作

PO、DO、BO、DTO、DO、POJO、JavaBean、JavaBeans

PO:持久对象 (persistent object)

po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数据库表里面的某个字段。完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。持久对象是由insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。

VO:表现层对象(View Object)

要对应展示界面显示的数据对象,用一个VO对象来封装整个界面展示所需要的对象数据,数据脱敏,去掉用户隐私数据。

BO:业务对象层的缩写(Business Object)

封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。具体可以看网上的一个例子:

比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
这样处理业务逻辑时,我们就可以针对BO去处理。

DTO:数据传输对象(Data Transfer Object)

是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。简单来说,当我们需要一个对象10个字段的内容,但这个对象总共有20个字段,我们不需要把整个PO对象全部字段传输到客户端,而是可以用DTO重新封装,传递到客户端。此时,如果这个对象用来对应界面的展现,就叫VO。

JavaBean:一种可重用组件

  • 定义:即“一次性编写,任何地方执行,任何地方重用”。满足三个条件
    • ① 类必须是具体的和公共的
    • ② 具有无参构造器
    • ③ 提供一致性设计模式的公共方法将内部域暴露成员属性。
  • 主要用途:可以用在 功能、处理、值、数据库访问和JSP中任何可以用Java代码创造的对象。
    • 第一种是有用户界面(UI,User Interface)的JavaBean;
    • 第二种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
  • 分类:通常有Session bean,Entity bean,MessageDrivenBean三大类
    • Session bean会话构件,是短暂的对象,运行在服务器上,并执行一些应用逻辑处理,它由客户端应用程序建立,其数据需要自己来管理。分为无状态和有状态两种。
    • Entity bean实体构件,是持久对象,可以被其他对象调用。在建立时指定一个唯一标示的标识,并允许客户程序,根据实体bean标识来定位beans实例。多个实体可以并发访问实体bean,事务间的协调由容器来完成。
    • MessageDriven Bean消息构件,是专门用来处理JMS(Java Message System)消息的规范(EIB2.0)。JMS是一种与厂商无关的API,用来访问消息收发系统,并提供了与厂商无关的访问方法,以此来访问消息收发服务。JMS客户机可以用来发送消息而不必等待回应。

JavaBeans:JavaBeans

从狭义来说,指的是 JavaBeans 规范也就是位于 java.beans 包中的一组 API。从广义上来说,JavaBeans 指的是 API 集合,比如 Enterprise JavaBeans。

POJO:POJO(Plain Ordinary Java Object)简单的Java对象

  • 实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。通指没有使用Entity Beans的普通java对象,可以把POJO作为支持业务逻辑的协助类。
  • POJO实质上可以理解为简单的实体类,顾名思义POJO类的作用是方便程序员使用数据库中的数据表,对于广大的程序员,可以很方便的将POJO类当做对象来进行使用,当然也是可以方便的调用其get,set方法。POJO类也给我们在struts框架中的配置带来了很大的方便。
    • 一个POJO持久化以后就是PO
    • 直接用它传递、传递过程中就是DTO
    • 直接用来对应表示层就是VO

DAO: 数据访问对象是第一个面向对象的数据库接口

  • 定义:是一个数据访问接口(Data Access Object)。它可以把POJO持久化为PO,用PO组装出来VO、DTO。
  • DAO模式是标准的J2EE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开.一个典型的DAO实现有下列几个组件:
    1. 一个DAO工厂类;
    2. 一个DAO接口;
    3. 一个实现DAO接口的具体类;
    4. 数据传递对象(有些时候叫做值对象) 具体的DAO类包含了从特定的数据源访问数据的逻辑,一般一个DAO类和一张表对应,每个操作要和事务关联。

参考文章: 芋道 Spring Boot SpringMVC 入门& 02丨架构分层:我们为什么一定要这么做?& java web开发中的各种层& MyBatis是什么& Entity层、DAO层、Service层、Controller层& SpringBoot框架中各层(DTO、DAO、Service、Controller)理解