spring体系结构_了解Spring Web应用程序体系结构:经典方法

spring体系结构

每个开发人员必须了解两件事:

  1. 架构设计是必要的。
  2. 花哨的体系结构图没有描述应用程序的真实体系结构。

真正的体系结构是从开发人员编写的代码中找到的,如果不设计应用程序的体系结构,最终将得到一个具有多个体系结构的应用程序。

这是否意味着开发人员应由建筑师统治?

不行 架构设计非常重要,不能只留给建筑师 ,这就是为什么每个想要不仅仅是一个类型编写者的开发人员都必须擅长 于此 。

让我们从两个原则入手,这两个原则将帮助我们为基于Spring的Web应用程序设计更好,更简单的体系结构。

优秀建筑的两大Struts

建筑设计可能感觉像是一项艰巨的任务。 这样做的原因是,许多开发人员被教导要相信架构设计必须由神秘知识的守护者来完成。 这些人称为软件架构师。

但是, 任务本身并没有听起来那么复杂 :

软件体系结构是软件系统的高层结构,创建这种高层结构的准则以及该结构的文档。

尽管经验确实可以帮助我们创建更好的架构,但是架构设计的基本工具实际上非常简单。 我们要做的就是遵循以下两个原则:

1.关注点分离(SoC)原则

关注点分离(SoC)原则指定如下:

关注点分离(SoC)是一种用于将计算机程序分为不同部分的设计原理,这样每个部分都可以解决一个单独的关注点。

这意味着我们应该:

  1. 确定我们需要注意的“问题”。
  2. 决定我们要在哪里处理它们。

换句话说,该原理将帮助我们确定所需的层以及每个层的职责。

2.保持简单愚蠢(KISS)原则

保持简单愚蠢(KISS)原则指出:

如果将大多数系统保持简单而不是使其变得复杂,则它们的工作效果最佳。 因此,简单性应该是设计的主要目标,并且应避免不必要的复杂性。

这个原则是理性的声音。 它提醒我们,每个层都有价格,如果我们创建一个复杂的体系结构而具有太多的层,则价格会太高。

换句话说, 我们不应该设计这样的架构

来源:Geek and Poke:足迹–根据CC 3.0许可

来源: Geek and Poke:足迹 – 根据CC 3.0许可


我认为约翰,朱迪,马克和戴维犯有手淫罪 。 他们遵循关注点分离原则,但忘记了最小化其体系结构的复杂性。 可悲的是,这是一个常见的错误,并且价格很高:

  1. 添加新功能要花的时间比应该花的时间长得多,因为我们必须通过每一层传输信息。
  2. 维护应用程序是一件不可能的事,因为没有人真正了解架构,并且每次做出的临时决定都会堆积起来,直到我们的代码库看起来像是一大堆东西,有十层。

这就提出了一个明显的问题:

什么样的架构可以很好地为我们服务?

每个人都应该做到三层

如果考虑Web应用程序的职责,我们会注意到Web应用程序具有以下“问题”:

  • 它需要处理用户的输入并将正确的响应返回给用户。
  • 它需要一个异常处理机制来向用户提供合理的错误消息。
  • 它需要一种交易管理策略。
  • 它需要同时处理身份验证和授权。
  • 它需要实现应用程序的业务逻辑。
  • 它需要与使用的数据存储和其他外部资源进行通信。

我们可以通过仅使用“三层”来解决所有这些问题。 这些层是:

  • Web层是Web应用程序的最上层。 它负责处理用户的输入并将正确的响应返回给用户。 Web层还必须处理其他层引发的异常。 因为Web层是我们应用程序的入口点,所以它必须注意身份验证,并充当防范未授权用户的第一道防线。
  • 服务层位于Web层下方。 它充当事务边界,同时包含应用程序和基础结构服务。 应用程序服务提供服务层的公共API。 它们还充当交易边界并负责授权。 基础结构服务包含“管道代码”,该“管道代码”与外部资源(例如文件系统,数据库或电子邮件服务器)进行通信。 通常,不止一个应用程序服务会使用这些方法。
  • 存储库层是Web应用程序的最低层。 它负责与使用的数据存储进行通信。

属于特定层的组件可以使用属于同一层或其下一层的组件。

经典的Spring Web应用程序的高级体系结构如下所示:

Spring Web应用程序层

我们要做的下一步是设计每一层的接口,这是我们遇到诸如数据传输对象(DTO)和域模型之类的术语的阶段。 这些术语描述如下:

  • 数据传输对象是一个仅是简单数据容器的对象,这些对象用于在不同进程之间以及应用程序各层之间承载数据。
  • 域模型由三个不同的对象组成:
    • 域服务是一种无状态类,提供与域概念相关但不是实体或值对象的“自然”部分的操作。

现在我们知道了这些术语的含义,我们可以继续设计每一层的接口。 让我们一层一层地进行检查:

  • Web层应仅处理数据传输对象。
  • 服务层将数据传输对象(和基本类型)作为方法参数。 它可以处理域模型对象,但只能将数据传输对象返回到Web层。
  • 存储库层将实体(和基本类型)作为方法参数,并返回实体(和基本类型)。

这就提出了一个非常重要的问题:

我们真的需要数据传输对象吗? 为什么我们不能仅将实体和值对象返回到Web层?

这是一个坏主意有两个原因:

  1. 域模型指定了我们应用程序的内部模型。 如果我们将此模型暴露给外界,则客户将不得不知道如何使用它。 换句话说,我们的应用程序的客户将不得不照顾不属于他们的东西。 如果使用DTO,则可以向应用程序的客户端隐藏此模型,并提供更简单,更简洁的API。
  2. 如果我们将领域模型暴露给外部世界,那么我们在不破坏依赖于它的其他内容的情况下就无法更改它。 如果我们使用DTO,只要不对DTO进行任何更改,就可以更改域模型。

经典Spring Web应用程序的“最终”架构如下所示:

Spring Web App体系结构

还有许多未解决的问题

这篇博客文章描述了Spring Web应用程序的经典体系结构,但未提供对真正有趣的问题的任何答案,例如:

  • 为什么X层负责关注点Y?
  • 我们的应用程序应该包含三层还是少于三层?
  • 我们应该如何设计每一层的内部结构?

这样做的原因是简单的:

我们必须学会走路才能跑步

本教程的下一篇博客文章将回答这些问题。

翻译自: https://www.javacodegeeks.com/2014/10/understanding-spring-web-application-architecture-the-classic-way.html

spring体系结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 网络库都干了什么?

虽然市面上已经有很多成熟的网络库,但是编写一个自己的网络库依然让我获益匪浅,这篇文章主要包含:TCP 网络库都干了些什么?编写时需要注意哪些问题?CppNet 是如何解决的。首先,大家都知道操作系统原生的soc…

iphone屏幕录制_iPhone怎么内录声音?怎么录制苹果手机内部声音?

有时我们想要对苹果手机上播放的声音进行录音,却不知道该如何操作。苹果手机上自带的录音软件只可以对手机外部声音进行录制,却无法录制自身播放的声音。其实我们可以先将苹果手机屏幕及声音先投放到电脑上,再通过支持内录的软件进行录音就可…

C 中命名空间的五大常见用法

译者注:可能很多程序员对C 已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。命名空间在1995年被引入到 c 标准中,通常是这样定义的:命名空间定义了新的作用域。它们提供了一…

英伟达TX2烧录系统_英伟达的DPU,是想在数据中心奇袭英特尔?

热点追踪 / 深度探讨 / 实地探访 / 商务合作最近几年,经常关注科技圈的朋友们总会发现,每次遇到厂商有重大发布,就总能看到“颠覆”、“极致”、“革命性”等概念出现在发布会上。上周,iPhone12的发布现场,蒂姆库克就用…

C vector详解

【导读】:vector是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,vector是一个能够存放任意类型的动态数组。接下来,请跟随小…

arcgis 出图背景_ArcGIS空间制图分析视频教程(二狮兄出品)含ArcMap

这套教程是二狮兄出的一套ArcGIS地理空间制图数据分析视频教程,含ArcMap/ArcCatalog部分。教程分为上中下三部,已全部录制完毕,全部课程120节。适用人群ArcGIS目前的应用范围非常广泛,包括但不限于从事地理景观、生态环境、规划设…

C 之父:C 的成功属于意料之外,C 11是转折点

C 的起源可以追溯到 40 年前,但它仍然是当今使用最广泛的编程语言之一。到 2020 年 9 月为止,C 是仅次于 C 语言、Java 和 Python,位于全球第四的编程语言。根据最新的 TIOBE 索引,C 也是增长最快的语言。近日,C 之父 …

aix磁盘挂载到linux,AIX下文件系统挂载点相互调换方案

由于业务发展的需要,企业在异地实现了数据块级的灾备,由于原来的备份目录lv所在VG恰好在远程灾备VG内(该方案实现的是vg级别的数据同步),为了节省带宽所以又从存储上新划分出一块磁盘新建了一个vg作为备份空间使用。但是由于当时厂商在创建vg…

苹果几最好用_深度解析安卓手机和苹果手机到底有哪些区别,哪种手机最好用...

"安卓阵营手机和苹果手机一直是手机界多年的竞争对手。由于安卓系统是开源的系统,任何厂家都能使用它。而导致安卓系统全球碎片化的主要原因是大部分国产品牌手机都没有安装谷歌服务,对于外国人的来说安装了谷歌服务的安卓手机才是完整的。然而中国…

linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错

安装centos系统时设置基础软件仓库出错,公钥,命令,视频教程,器上,提示安装centos系统时设置基础软件仓库出错易采站长站,站长之家为您整理了安装centos系统时设置基础软件仓库出错的相关内容。1、首先登录CentOS服务器,连接上服务器之后我们使用yum remo…

C 11实现的100行线程池

【导读】:C 线程池一直都是各位程序员们造轮子的首选项目之一。今天,小编带大家一起来看看这个轻量的线程池,本线程池是header-only的,并且整个文件只有100行,其中C 的高级用法有很多,很值得我们学习&#…

tensorflow2 目标检测_基于光流的视频目标检测系列文章解读

作者:平凡的外卖小哥全文5747字,预计阅读时间15分钟1 简介目前针对于图片的目标检测的方法大致分为两类:faster R-CNN/R-FCN一类:此类方法在进行bbox回归和分类之前,必须通过region proposal network(RPN)得到RoI&…

sts集成jboss_如何为JBoss Developer Studio 8设置集成和SOA工具

sts集成jboss最新的JBoss Developer Studio(JBDS)的发布带来了有关如何开始使用尚未安装的各种JBoss Integration和BPM产品工具集的问题。 在本系列文章中,我们将为您概述如何安装每套工具并说明它们支持哪些产品。 这将有助于您在着手进行…

C 多线程的互斥锁应用RAII机制

什么是RAII机制RAII是Resource Acquisition Is Initialization(翻译成 “资源获取即初始化”)的简称,是C 语言的一种管理资源、避免资源泄漏的惯用法,该方法依赖构造函数资和析构函数的执行机制。RAII的做法是使用一个类对象&…

c iostream.源码_通达信《K线上画趋势线预警》精选指标(附源码)

通达信《K线上画趋势线预警》精选指标K线上画趋势线预警源码:N:5;MA5:EMA(C,5)COLORWHITE;MA13:EMA(C,13)COLORCYAN;MA21:EMA(C,21)COLORMAGENTA;MA34:EMA(C,34)COLORYELLOW;MA55:EMA(C,55)COLORRED;{画线}A1:REF(H,N)HHV(H,2*N1);B1:FILTER(A1,N);C1:BACKSET(B1,N1…

linux module原理,NodeJS的模块原理

最近一直在使用Node JS,在网上看到了一段代码我觉得完美的诠释了Node JS模块加载的原理,其实深究下去,它还诠释了许多东西:Js模块化编程、闭包的真正强大之处等等。闲话不说,先看看这段代码:// - hello.jsv…

C 20 协程初探

【导读】:C 20 终于引入了协程特性,给库作者提供了一个实现协程的机制,让用户方便使用协程来编写异步逻辑,降低了异步并发编程的难度。结合我最近协程的学习,在这里记录一下相关内容。以下是正文使用场景协程和普通函数…

如何写一个简单的node.js C 扩展

node 是由 c 编写的,核心的 node 模块也都是由 c 代码来实现,所以同样 node 也开放了让使用者编写 c 扩展来实现一些操作的窗口。如果大家对于 require 函数的描述还有印象的话,就会记得如果不写文件后缀,它是有一个特定的匹配规则…

在线画 有穷状态自动机 的软件_怎么画思维导图?不用下载软件,在线就能操作...

怎么画思维导图?在工作中,除了流程图,脑图也是很重要的一个存在:流程图帮助我们快速完成任务,而脑图告诉我们任务本质。画思维导图是一个积累的过程,急不来,对于新手来说还是有一定难度的。由于…

Spring Boot Actuator:在其顶部具有MVC层的自定义端点

Spring Boot Actuator端点允许您监视应用程序并与之交互。 Spring Boot包含许多内置端点,您也可以添加自己的端点。 添加自定义端点就像创建一个从org.springframework.boot.actuate.endpoint.AbstractEndpoint扩展的类一样容易。 但是Spring Boot Actuator也提供了…