Java—三层架构 MVC SpringBoot基本框架

  • Post author:
  • Post category:java

我们先来看三层架构:

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用(服务端)划分为:

  • 表现层(User Interface layer):又叫表示层,负责接收用户请求、转发请求、生成数据的视图等。一般表现为界面,用户通过界面输入、查询和得到需要的数据。

  • 业务逻辑层(Business Logic Layer):简称业务层,是针对具体问题的操作,主要是从数据库中得到数据,然后对数据进行逻辑处理,是数据业务逻辑处理。

  • 数据访问层(Data access layer):又叫持久层,该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。负责持久化业务对象;

区分层次的目的即为了“高内聚,低耦合”的思想。

这三个分层,每一层都有不同的模式,即架构模式,如下图:

总结
  • 业务逻辑层并没有用sql语句对数据库进行操作,而只是调用数据访问层的接口/方法;通过数据访问层拿到存在数据库里的原始数据,然后再对数据进行逻辑上的处理,比如说验证;
  • 表现层只是起到和用户交互的一个功能,采集信息反馈结果。
  • 实体层不是三层架构的任意一层,它起到一个贯穿三层架构的作用。

再谈MVC模式:

MVC

模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • View(视图):视图代表模型包含的数据的可视化。是用户看到并与之交互的界面(它可以包括一些可以显示数据信息的页面,或者展示形式。例如jsp,html,asp,php)

  • Model(模型)

    • 模型是企业数据和业务规则(可以说就是后端接口,用于业务处理)。在MVC的三个部件中,模型拥有最多的处理任务。
    • 被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。
      (接口)
    • 由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
  • Controller(控制器)

    • 控制器接受用户的输入并调用模型和视图去完成用户的需求(接受客户发送的请求,根据请求调用所对应的接口,然后模型业务处理后返回的数据,由控制器决定调用那个View展示)。
    • 所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。
MVC的处理过程:
  • 首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理
  • 然后模型用业务逻辑来处理用户的请求并返回数据
  • 最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

这里有一个实例:
在客户端里输入用户名,密码 –> 发送http请求–>触发 Controller 调用 Model 的数据校验接口,Model 校验不符合,触发 Controller 选择登录失败的 View 返回给客户端,用户就看到一个登录失败的提示,之后客户端里输入正确的密码,重复之前的操作,如 model 校验 success,则触发 Controller 去做对应策略的选择,再调用 model 的登录接口来请求登录(策略设计模式),model 和数据存储系统交互,完毕之后触发 controller 更新 view(观察者设计模式)……用户就看到登录成功的提示了。

MVC的好处:
  • 首先,最重要的一点是多个视图能共享一个模型,正如我所提及的,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用代码了。

  • 控制器也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。

All in all
  • 可以通俗的讲说三个部分的作用:
    • M 即Model(模型层),主要负责处理业务逻辑(接口)以及数据库的交互
    • V 即View(视图层),主要负责显示数据和提交数据
    • C 即Controller(控制层),主要是永作辅助捕获请求并控制请求转发
  • 用一种业务逻辑、数据、界面显示分离的方法组织代码。
  • 业务逻辑数据库存取都聚集到一个部件里面(复合设计模式),在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

然后比较MVC和三层架构:

区别:
  • 在三层架构中没有定义Controller的概念。这是最不同的地方。而MVC也没有把业务的逻辑访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。

  • 在三层中也提到了Model,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是由业务逻辑与访问数据组成的。而MVC里,则是以实体类构成的。

  • MVC是对应三层架构中的划分?
    ①MVC中的model可以包括处理业务逻辑和数据库交互(接口),所以是表示层+业务层,并没有持久层。
    ②但是更权威的说法就和最开始的图片一样,把所有的逻辑操作都放在了业务层里面,在它所实现的主要功能里面,例如接收用户请求、转发请求、生成数据的视图等都肯定有业务逻辑,而MVC只相当于调用接口(类似调用持久层的接口),所以把MVC归结于表现层。

    对于MVC来说,持久层就是服务端提供的那些接口;

说明:

三层是基于业务逻辑来分的,而mvc是基于页面(文件所属类型)来分的

三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目。MVC是一个设计模式,它是根据项目的具体需求来决定是否适用于该项目。
那么架构跟设计模式有什么区别呢?
我们从接手一个项目开始,首先,我们需要进行架构设计,一般我们采用的就是分层式的架构设计,即我们的三层架构。
然后,在确定了架构以后,我们再根据项目的具体需求去考虑是否需要应用一些设计模式,比如是否应用我们的MVC模式,抽象工厂模式等等。(在这里我们看出,MVC与三层架构不是一个等级的,而与抽象工厂等设计模式才是一路的)

MVC模式是一种复合设计模式,一种解决方案

三层模式又可归于部署模式,MVC可归于表示模式

接着是事务脚本模式

业务层的架构模式有事务脚本模式、领域模型模式等等,企业应用中最关键的显然是业务层。

事务脚本模式

事务这里代表表示层的一个请求,所谓脚本就是一个方法,所谓事务脚本就是将一次请求封装为一个方法,所谓事务脚本模式,就是将业务层的对象分为三类,其中:

  • Service 类封装业务流程,或者说是纯粹的界面上的业务流程

  • DAO 类只负责对数据的操作,也就是封装对持久层的访问

  • DTO(Student)类封装业务的实体对象,负责业务层内数据的传输流动

详解:
  1. Service类:
  • 包含一个 service 接口和对应的 service 接口的实现类,dao 类似,而 dao 和 service 是一种聚合关系,service 类聚合了 dao 类。
  • 对于聚合:聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即 has-a 的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;
  • 比如计算机与cpu、公司与员工的关系等,表现在代码层面,和关联关系是一致的,只能从语义级别来区分;
  1. DAO类

  2. DTO类:

  • 在 dao 和 service 中都有关系,属于依赖关系。即:dao,service 依赖 DTO 类来传输数据对象
  • 依赖:是类 A 使用到了另一个类 B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是 B 类的变化会影响到 A;
  • 比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖,表现在代码层面为:类B(DTO)作为参数被类A(dao,service)在某个 method 使用,这就是所谓业务逻辑的组织方式

原则:

一般来说,框架 > 架构模式 > 设计模式 > 设计原则

打个比方,Hibernate是一个持久层框架,是数据映射器模式的具体实现,实现时用到了工厂模式等很多设计模式,体现了什么依赖倒转原则、开闭原则、里氏替换原则等等设计原则。
AngularJS是一个客户端 MVC 框架,是 MVC架构模式的一种实现,实现时用到……设计模式,体现了……等设计原则。
MVC是表示层框架诸如此类。

  • 三层架构模式
  • MVC设计模式
  • 抽象工厂设计模式
  • 事务脚本架构模式
  • Hibernate持久层框架

springboot的结构:

SpringBoot 实际上是一个快速开放框架,里面的web模块中是包含SpringMVC的;
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架
SpringBoot是Spring框架的一个模块,用于创建独立的,生产级的Spring基础应用程序,并且程序员的工作量最小。它是在核心弹簧框架之上开发的。spring boot背后的主要概念是避免大量的样板代码和配置来改进开发,单元测试等。在创建新的spring应用程序的情况下,我们编写了许多XML配置,服务器设置,添加依赖项等。这些配置文件是样板代码的一个例子。Spring boot避免了所有这些样板代码。

框架:


首先来说一下业务逻辑

Controller–>service接口–>serviceImpl–>dao接口–>daoImpl–>mapper–>database

Dao(Data Access Object):数据存储对象

DAO = Data Access Object = 数据存取对象。
dao层即数据持久层,也被称为mapper层
不管是什么框架,我们很多时候都会与数据库进行交互。如果遇到一个场景我们都要去写SQL语句,那么我们的代码就会很冗余。所以,我们就想到了把数据库封装一下,让我们的数据库的交道看起来像和一个对象打交道,这个对象通常就是DAO。当我们操作这个对象的时候,这个对象会自动产生SQL语句来和数据库进行交互,我们就只需要使用DAO就行了。

通常我们在DAO层里面写接口,里面有与数据打交道的方法。SQL语句通常写在mapper文件里面的。

优点:结构清晰,Dao层的数据源配置以及相关的有关数据库连接的参数都在Spring配置文件中进行配置。

简单来说,dao层的作用为访问数据库,向数据库发送sql语句,完成数据的增删改查任务

Service:服务

服务是一个相对独立的功能模块,主要负责业务逻辑应用设计。首先也要设计接口,然后再设计其实现该接口的类。这样我们就可以在应用中调用service接口进行业务处理。service层业务实现,具体调用到已经定义的DAO的接口,封装service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性 。

如果把Dao层当作积木,则Service层则是对积木的搭建。

Controller:控制器

主要负责具体业务模块流程的控制,此层要调用到Service层的接口去控制业务流程,控制的配置同样在Spring配置文件中配置。针对不同的业务流程有不同的控制器。在设计的过程可以设计出重复利用的子单元流程模块。

model:模型

模型就是指视图的数据Model,模型,通常来讲,我们会把模型和另一个东西放在一起来说:View,视图。

模型通常认为是视图的内核,何谓之视图?我们正在与之交互的网站的界面就是视图,而模型是指他的内核:数据。

将Model和View的概念拆分开来,有助于我们关注不同的方面,也可以更有效的分工。有些工程师更关注于内核也就是模型,通常来说,他们被称之为后端工程师。有些工程师更关注于用户界面的交互和展示,通常来说,他们被称之为前端工程师。
(Entity层)

View层:

与Controller层关系紧密,View层主要负责前台jsp页面的表示。

它们之间的关系

Controller层像是一个服务员,他把客人(前端)点的菜(数据、请求的类型等)进行汇总什么口味、咸淡、量的多少,交给厨师长(Service层),厨师长则告诉沾板厨师(Dao 1)、汤料房(Dao 2)、配菜厨师(Dao 3)等(统称Dao层)我需要什么样的半成品,副厨们(Dao层)就负责完成厨师长(Service)交代的任务。

建立了DAO层后才可以建立Service层,而Service层又是在Controller层之下的,因而Service层应该既调用DAO层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。


版权声明:本文为qq_44263261原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。