应用分层
在开发的过程中, 我们会发现, 程序的代码有时会很"杂乱", 如果后面的项目更大了, 那就会更加地杂乱无章(文件乱, 代码内容乱).
也基于此, 接下来让我们来学习一下应用分层.
也类似于公司的组织架构
公司初创阶段, 一个人身兼数职, 既做财务, 又做人事,还有行政.
随着公司的逐渐壮大, 会把岗位进行细分, 划分为财务部门, 人事部门, 行政部门等.各个部门内部还会再进行划分.
项目开发也是类似, 最开始功能简单时, 我们会放在前后端一起开发. 随着项目功能的复杂, 我们分为前端和后端不同的团队, 甚至更细粒度的团队. 后端开发也会根据功能再进行细分. MVC就是其中的一种拆分方式.
但是随着后端人员不再涉及前端, 后端开发又有了新的分层方式.
介绍
在阿里开发手册中, 关于工程结构部分, 定义了常见工程的应用分层结构:
那什么是应用分层呢?
应用分层是一种软件开发设计思想, 它将应用程序分成N个层次, 这N个层次分别负责各自的职责, 多个层次之间协同提供完整的功能. 根据项目的复杂度, 把项目分成三层, 四层或者更多层.
常见的MVC设计模式, 就是应用分层的一种具体体现.
为什么需要应用分层?
在最开始的时候, 为了让项目快速上线, 我们是通常不考虑分层的. 但是随着业务越来越复杂, 大量的代码混在一起, 会出现逻辑不清晰, 各模块相互依赖, 代码扩展性差, 改动一处就会让全身出现问题. 所以学习项目分层就是程序员的必修课了.如何分层(三层架构)?
我们知道, MVC就是把整体的系统分成了Model(模型), View(视图) 和Controller(控制器)三个层次, 也就是将用户视图和业务处理隔离开, 并通过控制器连接起来, 很好地实现逻辑与表现的解耦, 是一种标准的软件分层架构.
目前现在更主流的开发方式是"前后端分离"的模式, 后端开发工程师不再关注前端的实现, 所以对于Java后端开发者, 又有了一种新的分层架构: 把整体架构分为表现层, 业务逻辑层和数据层. 这种分层方式也称为"三层架构".
1.表现层: 就是展示数据结果和接收用户指令的, 是最靠近用户的一层;
2.业务逻辑层: 负责处理业务逻辑, 里面有复杂业务的具体实现;
3.数据层: 负责存储和整理与应用程序相关的数据.
按照上面的层次划分, Spring MVC站在后端人员的角度上, 也进行了支持, 把上面的代码划分为三个部分:
请求处理, 响应数据: 负责, 接收页面的请求, 给页面响应数据.
逻辑处理: 负责业务逻辑处理的代码.
数据访问: 负责业务数据的维护操作, 包括增, 删, 查, 改等操作.
Controller:控制层. 接收前端发送的请求, 对请求进行处理, 并响应数据.
Service:业务逻辑层. 处理具体的业务逻辑.
Dao:数据访问层, 也称为持久层. 负责数据的访问操作, 包括增删查改.
MVC和三层架构的区别和联系
在它们的联系上, 众说风云, 能够自己说出自己的观点即可.
从概念上来讲, 它们都是软件工程领域中的架构模式.
MVC三层架构模式由三部分组成, 分别是: 模型, 视图, 控制器.
三层架构将业务应用划分为: 表现层, 业务逻辑层, 数据访问层.
MVC中, 视图和控制器合起来对应三层架构中的表现层. 模型对应三层架构中的业务逻辑层, 数据层以及实体类.
两者实际上是从不同角度上对软件工程进行了抽象.
MVC模式强调数据和视图的分离,将数据展示和数据处理分隔开, 通过控制器对两者进行组合.
三层架构强调的是不同维度数据处理的高内聚和低耦合,将交互界面, 业务处理和数据库操作的逻辑分开.
两者共同的目的都是: "解耦, 分层, 代码复用".
软件设计的原则:高内聚低耦合
高内聚指的是: 一个模块中各个元素之间联系的紧密程度, 如果各个元素(语句,程序段)之间的联系程度越高, 则内聚性越高, 即"高内聚".
低耦合指的是: 软件中各个层, 模块之间的依赖关联程序越小越好. 修改一处代码, 其它模块的代码改动越少越好.
高内聚和低耦合矛盾吗?
不矛盾, 高内聚指的是一个模块中各个元素之间的紧密程度, 低耦合指的是不同模块之间的紧密程度.
这就好比一个企业, 包含很多部门, 各个部门之间的关联关系要尽可能的小, 一个部门发生问题,要尽可能对降低的其它部门减小影响, 就是耦合. 但是部门内部员工关系要尽可能紧密, 遇到问题一起解决, 克服, 这叫做内聚.
应用分层的好处
降低层与层之间的依赖, 结构更加的明确, 利于各层逻辑的复用.
开发人员可以只关注整个结构中的其中的某一层, 极大地降低了维护成本和维护时间.
可以很容易的用新的实现替换原有层次的体现
有利于标准化.
大总结
1.学习Spring MVC, 其实就是学习各种Web开发需要用到的注解.
(1)@RequestMapping: 路由映射
(2)@RequestParam: 后端参数重命名
(3)@RequestBody: 接收JSON类型的参数
(4)@PathVariable: 接收路径参数
(5)@RequestPart:上传文件
(6)@ResponseBody: 返回数据
(7)@CookieValue: 从Cookie中获取值
(8)@SesssionAttribute: 从Session中获取值
(9)@RequestHeader: 从Header中获取值
(10)@Controller: 定义一个控制器, Spring框架启动时加载, 把这个对象交给Spring管理.默认返回视图
(11)@RestController: @RequestBody + @Controller 返回数据.
2.Cookie和Session都是会话机制, Cookie是客户端机制, Session是服务端机制. 两者通过SessionId来关联. Spring MVC内置HttpServletRequest, HttpServletResponse两个对象.需要使用时, 直接在方法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中获取, 也可以直接使用HttpServletResponse设置Http响应状态码.
3.JavaEE学习阶段会涉及到较多的工具,插件的学习.