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

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

  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应用程序架构

还有许多未解决的问题

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

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

这样做的原因是简单的:

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

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

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

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

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

相关文章

springmvc注解小示例(转)

转自:http://www.blogjava.net/pengo/archive/2010/11/28/339229.html 弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mv…

解决maven项目Cannot change version of project facet Dynamic web module to 3.0

1、打开新建的servlet文件例如&#xff08;hibernate.cfg.xml&#xff09;修改头文件为 <?xml version"1.0" encoding"UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" &quo…

爬取w3c课程—Urllib库使用

爬虫原理 浏览器获取网页内容的步骤&#xff1a;浏览器提交请求、下载网页代码、解析成页面&#xff0c;爬虫要做的就是&#xff1a; 模拟浏览器发送请求&#xff1a;通过HTTP库向目标站点发起请求Request&#xff0c;请求可以包含额外的header等信息&#xff0c;等待服务器响应…

关于SSL证书配置、升级的一些问题总结

SSL会成为网站、APP、小程序&#xff08;小程序已经强制使用https&#xff09;等项目的标配。关于SSL证书安装使用的问题今天总结下&#xff0c;以备用。 环境配置&#xff1a;windows server 2008 R2和IIS7.0 1、 安装SSL证书的环境 (温馨提示&#xff1a;安装证书前请先备份…

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

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

WildFly 8的Camel子系统集成了Java EE –入门

就在三天前&#xff0c;围绕Thomas Diesler&#xff08; tdiesler &#xff09;的团队发布了WildFly-Camel子系统的2.0.0.CR1版本&#xff0c;它允许您将Camel Routes添加为WildFly配置的一部分。 路由可以部署为JavaEE应用程序的一部分。 JavaEE组件可以访问Camel Core API和各…

jQuery中国各个省份地图分部代码

jQuery中国各个省份地图分部代码 在线演示本地下载更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

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

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

jQuery自适应倒计时插件

jQuery自适应倒计时插件 在线演示本地下载更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

Unity3D实践系列03,使用Visual Studio编写脚本与调试

在Unity3D中&#xff0c;只有把脚本赋予Scene中的GameObject&#xff0c;脚本才会得以执行。 添加Camera类型的GameObject。 Unity3D默认使用"MonoDevelop"编辑器&#xff0c;这里&#xff0c;我想使用Visual Studio作为编辑器。 依次点击"Edit","Pre…

纯CSS3文字Loading动画特效

纯CSS3文字Loading动画特效是一款个性的loading文字加载动画。 在线演示本地下载更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

如何为JBoss Developer Studio 8设置BPM和规则工具

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

基于HTML5陀螺仪实现ofo首页眼睛移动效果

最近用ofo小黄车App的时候&#xff0c;发现以前下方扫一扫变成了一个眼睛动的小黄人&#xff0c;觉得蛮有意思的&#xff0c;这里用HTML5仿一下效果。 ofo眼睛效果 效果分析 从效果中不难看出&#xff0c;是使用陀螺仪事件实现的。 这里先来看一下HTML5中陀螺仪事件的一些概…

定时开机 命令 自动开机

自动开机&#xff1a; 首先开机后按住Delete键&#xff0c;就是平常常用的删除按键&#xff0c;然后就会进入到BIOS界面。虽然是一个满眼E文的蓝色世界&#xff0c;但不要害怕&#xff0c;没有问题的。 在BIOS设置主界面中选择“Power”选项,进入电源管理窗口。有些机器是在“P…

多米诺骨牌 优化版

算法&#xff1a; 在之前搜索出状态的基础上&#xff0c;再压缩一次状态。 View Code //by yefeng #include<iostream> using namespace std;typedef long long LL; const int mod 9937; int mask,idx, n , m;struct Matrix{int mat[257][257];void zero(){ memse…

Apache Camel请向我解释这些端点选项的含义

在即将发布的Apache Camel 2.15中&#xff0c;我们使Camel更智能。 现在&#xff0c;它可以充当老师&#xff0c;并向您说明其配置方式以及这些选项的含义。 Camel可以做的第一课是告诉您如何配置所有端点以及这些选项的含义。 接下来我们要学习的课程是让Camel解释EIP的选项…

微信扫码进入小程序

这几天开发完小程序之后&#xff0c;需要实现微信扫码进入小程序&#xff0c;坎坎坷坷的过程终于实现了&#xff0c;现在做一总结&#xff1a; 1、配置二维码规则&#xff1a; 2、页面插入代码即可&#xff1a; onLoad: function(options) {console.log("index 生命周期 o…

使用用户名/密码和Servlet安全性保护WebSockets

RFC 6455提供了WebSockets安全注意事项的完整列表。 其中一些是在协议本身中烘焙的&#xff0c;其他一些则需要更多有关如何在特定服务器上实现它们的解释。 让我们谈谈协议本身内置的一些安全性&#xff1a; HTTP请求中的Origin头仅包含标识发起该请求的主体&#xff08;网页…

线程池之外:Java并发并不像您想象的那么糟糕

Apache Hadoop&#xff0c;Apache Spark&#xff0c;Akka&#xff0c;Java 8流和Quasar&#xff1a; 针对Java开发人员的经典用例以及最新的并发方法 关于并发性更新概念的讨论很多&#xff0c;但是许多开发人员还没有机会将他们的想法缠住。 在本文中&#xff0c;我们将详细介…

vue中使用Ueditor编辑器 -- 1

一、 下载包&#xff1a; 从Ueditor的官网下载1.4.3.3jsp版本的Ueditor编辑器&#xff0c;官网地址为&#xff1a;http://ueditor.baidu.com/website/download.html 下载解压后会得到如果下文件目录&#xff1a; 将上述Ueditor文件夹拷贝到vue项目的static文件夹中&#xff0…