Spring Web应用程序的最大缺陷

在其应用程序中使用Spring Framework的开发人员很好地谈论了依赖注入的好处。 不幸的是,他们并不是很好地利用它的好处,例如单一负责的原则和在应用程序中关注点的分离 。 如果我们看一下任何基于Spring的Web应用程序,很可能会通过使用以下常见且同样错误的设计原则来实现该应用程序:

  1. 域模型对象仅用于存储应用程序的数据。 换句话说,领域模型遵循贫血领域模型反模式 。
  2. 业务逻辑位于服务层中,该服务层管理域对象的数据。
  3. 服务层对应用程序的每个实体都有一个服务类。

问题是:如果这是如此普遍,那怎么可能是错误的呢? 让我们找出答案。

旧习难改

Spring Web应用程序之所以这样看,是因为这是一成不变的方式,旧习惯很难消除,特别是如果它们是由高级开发人员或软件架构师实施的。 问题是这些人非常擅长捍卫自己的观点。 他们最喜欢的论点之一是,我们的应用程序遵循关注点分离原则,因为它已分为几层,每一层都有特定的职责。

典型的Spring Web应用程序具有以下几层:

  • Web层负责处理用户的输入并将正确的响应返回给用户。 Web层仅与服务层通信。
  • 充当事务边界的服务层 。 它还负责授权,并包含我们应用程序的业务逻辑。 服务层管理域模型对象,并与其他服务和存储库层进行通信。
  • 存储库/数据访问层 ,负责与使用的数据存储进行通信。

关注点分离原则定义如下:

关注点分离(Soc)是一种用于将计算机程序分为不同部分的设计原理,这样每个部分都可以解决一个单独的关注点。 尽管确实有一个典型的Spring Web应用程序在一定程度上遵循了这一原理,但现实情况是该应用程序具有一个整体的服务层,它承担了太多的责任。 更具体地说,服务层有两个主要问题:

首先,从服务层找到应用程序的业务逻辑。

这是一个问题,因为业务逻辑分散在服务层周围。 如果我们需要检查特定业务规则的实施方式,则必须首先找到它。 这可能并不容易。 另外,如果多个服务类别中需要相同的业务规则,则很可能会将规则简单地从一个服务复制到另一个服务。 这导致了维护的噩梦。

其次,服务层在每个域模型类中都有一个服务类。

这违反了如下定义的单一责任原则:单一责任原则规定每个类都应具有单一责任,并且该责任应完全由该类封装。 它的所有服务都应严格地与这一责任保持一致。

服务类具有很多依赖关系和很多循环依赖关系 。 典型的Spring Web应用程序的服务层并不由松散耦合的服务组成,这些服务仅具有一种责任。 它更像是紧密耦合的整体服务网络。 这使得难以理解,维护和重用。 这听起来可能有点苛刻,但是服务层通常是Spring Web应用程序中最有问题的部分。 对我们来说幸运的是,所有希望都没有丢失。

挣脱

当前的情况很糟,但并非完全没有希望。 让我们找出如何摆脱旧习惯。

首先,我们必须将应用程序的业务逻辑从服务层移到域模型类。

如果考虑以下示例,应该使我们明白这一点的理由:

假设我是服务类,而您是域模型对象。 如果有人告诉您从屋顶上跳下来,您是否愿意对我的决定拥有否决权?

将业务逻辑从服务层移到域模型类将为我们带来三个好处:

  1. 我们代码的职责以逻辑方式划分。 服务层负责应用程序逻辑,而我们的域模型类负责业务逻辑。
  2. 我们的应用程序的业务逻辑可从一个地方找到。 如果我们需要验证特定业务规则的实施方式,那么我们总是知道在哪里寻找。
  3. 服务层的源代码更干净,不包含任何复制粘贴代码。

其次,我们必须将特定于实体的服务划分为仅用于单一目的的较小服务。

例如,如果我们的应用程序具有单个服务类,该服务类为人员和与用户帐户相关的操作提供CRUD操作,则应将其分为两个单独的服务类:

  • 第一项服务为人员提供CRUD操作。
  • 第二服务提供与用户帐户有关的操作。

这给了我们三大优势:

  1. 每个服务类都有一套逻辑职责。
  2. 每个服务类别的依存关系都较少,这意味着它们不再是紧密耦合的巨人。 它们是较小的且松散耦合的组件。
  3. 服务类更易于理解,维护和重用。

这两个简单的步骤将帮助我们清理应用程序的体系结构,并提高开发人员的工作效率和满意度。

现在,我们可能想知道这是否真的必要?如果需要,何时解决这些问题至关重要?

有时生活是黑白的

我经常听到一个论点,指出我们不应该过多关注“体系结构”,因为我们的应用程序既小又简单。 尽管这种说法有一定道理,但我们必须记住, 从小做起的项目可以成长为更大的项目 。

如果我们在发生这种情况时没有考虑到这一点,那么我们就被搞砸了。

在未知的水域中航行可能听起来是个坏主意,但我们必须记住,泰坦尼克号被沉没的冰山撞到时正沿着熟悉的路线航行。 现在我们的应用程序可能正在发生同样的事情。

当事情失控时,我们必须有勇气喊叫停止

PS:如果您准备服用红色药丸,建议您阅读“ 哎呀! Olivier Gierke的架构在哪里去了(或观看他关于同一主题的SpringOne2GX演示 )。 但是请注意,兔子洞比您想象的要深得多。

参考: Petri Kainulainen博客上来自我们JCG合作伙伴 Petri Kainulainen 的Spring Web应用程序的最大缺陷 。

翻译自: https://www.javacodegeeks.com/2013/06/the-biggest-flaw-of-spring-web-applications.html

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

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

相关文章

用C++调用tensorflow在python下训练好的模型(centos7)

本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1] bazel安装参考:https://blog.csdn.net/luoyi131420/article/details/78585989 [2] 首先介绍下自己的环境是centos7,tensorflow版本是1.7,python是3.6(anacond…

纯CSS实现圆角边框

HTML部分&#xff1a;<body><div> <b class”t1″></b> <b class”t2″></b> <b class”t3″></b> <b class”t4″></b> <div class”cont”>这边输入实际内容</div> <b clas…

ActiveMQ producer同步/异步发送消息

http://activemq.apache.org/async-sends.html producer发送消息有同步和异步两种模式&#xff0c;可以通过代码配置&#xff1a; ((ActiveMQConnection)connection).setUseAsyncSend(true); producer默认是异步发送消息。在没有开启事务的情况下&#xff0c;producer发送持久化…

Java Priority Queue(PriorityQueue)示例

我们知道&#xff0c; 队列如下&#xff1a;F irst- 我正˚First-UT模型&#xff0c;但有时我们需要处理的基础上&#xff0c;优先级队列中的对象。 例如&#xff0c;假设我们有一个应用程序可以为日常交易生成股票报告&#xff0c;并处理大量数据并花费时间来处理它。 因此&am…

css未知尺寸的图片的水平和垂直居中

纯CSS实现未知尺寸的图片水平和垂直居中.box { /*非IE的主流浏览器识别的垂直居中的方法*/ display: table-cell; vertical-align:middle; /*设置水平居中*/ text-align:center; /* 针对IE的Hack */ *display: block; *font-size:26…

heap 的一些用法

noip 合并果子 #include<bits/stdc.h> using namespace std; int heap[maxn]; int size0; void input(int d) {heap[size]d;push_heap(heap,heapsize,greater<int>()); } int get() {pop_heap(heap,heapsize,greater<int>());//pop_heap(heap,heapsize);ret…

java 反射 new class_Java高级特性-反射:不写死在代码,还怎么 new 对象?

反射是 Java 的一个高级特性&#xff0c;大量用在各种开源框架上。在开源框架中&#xff0c;往往以同一套算法&#xff0c;来应对不同的数据结构。比如&#xff0c;Spring 的依赖注入&#xff0c;我们不用自己 new 对象了&#xff0c;这工作交给 Spring 去做。然而&#xff0c;…

EF Core利用Scaffold从根据数据库生成代码

在EF6 之前的时代&#xff0c;如果需要从数据库中生成代码&#xff0c;是可以直接在界面上操作的&#xff0c;而到了EF Core的时代&#xff0c;操作方式又有更简便的方式了&#xff0c;我们只需要记住以下这条指令。 Scaffold-DbContext "Server服务器地址;Database数据库…

如何通过CSS开启硬件加速来提高网站性能

你知道我们可以在浏览器中用css开启硬件加速&#xff0c;使GPU (Graphics Processing Unit) 发挥功能&#xff0c;从而提升性能吗&#xff1f; 现在大多数电脑的显卡都支持硬件加速。鉴于此&#xff0c;我们可以发挥GPU的力量&#xff0c;从而使我们的网站或应用表现的更为流畅…

Spring Security应用程序中的su和sudo

很久以前&#xff0c;我从事的项目具有很强大的功能。 有两个角色&#xff1a;用户和主管。 主管可以以任何方式更改系统中的任何文档&#xff0c;而用户则更受工作流约束的限制。 当普通用户对当前正在编辑和存储在HTTP会话中的文档有疑问时&#xff0c;主管可以介入&#xff…

示例介绍:JavaFX 8打印

我有一段时间没有写博客了&#xff0c;我想与其他人分享有关JavaFX的所有信息&#xff08;我的日常工作和家庭可能是借口&#xff09;。 对于那些是本博客的新手&#xff0c;我是JavaFX 2 Introduction by Example&#xff08;JIBE&#xff09;的作者&#xff0c; Java 7 Recip…

placeholder的使用

1.定义 placeholder 属性提供可描述输入字段预期值的提示信息 该提示会在输入字段为空时显示&#xff0c;并会在字段获得焦点时消失。 注释&#xff1a;placeholder 属性适用于以下的 <input> 类型&#xff1a;text, search, url, telephone, email 以及 password。 2.用…

字符串练习

字符串练习&#xff1a; http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html 取得校园新闻的编号 trhttp://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html print(a[-14:-5])https://docs.python.org/3/library/turtle.html 产生python文档的网址 trhttps:/…

CSS清除行内元素之间的HTML空白

至今我还记得年轻是在IE6上开发的那些苦逼日子,特别希望IE浏览器采用 inline-block 的显示方式.行内块(inline-block)是非常有用的,特别是想要不用block和float来控制这些行内元素的margin,padding之时。问题来了,HTML源码中行内元素之间的空白有时候显示在屏幕上那是相当的讨厌…

int64 java_为什么json 不能使用 int64类型

json 简介jsON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集 。 JSON采用完全独立于语言的文本格式&#xff0…

Spring MVC自定义验证注释

在上一教程中&#xff0c;我展示了如何使用注释来验证表单 。 这对于简单的验证非常有用&#xff0c;但是最终&#xff0c;您需要验证一些现成的注释中没有的自定义规则。 例如&#xff0c;如果您需要根据输入的出生日期来验证用户已超过21岁&#xff0c;或者可能需要验证用户的…

Best Time to Buy and Sell Stock with Cooldown

https://soulmachine.gitbooks.io/algorithm-essentials/java/dp/best-time-to-buy-and-sell-stock-with-cooldown.html转载于:https://www.cnblogs.com/ZhiHao-queue/p/9521933.html

前期

转载于:https://www.cnblogs.com/joker157/p/8618091.html

解决IE8下body{ overflow:hidden;}无效的解决办法

css中IE8 body{ overflow:hidden;}无效的解决办法&#xff1a; 在页面html中使用: body{ overflow:hidden; } 在ie8下无效 &#xff0c;仍然有滚动条。 解决的办法如下&#xff1a; 替换为如下: html { overflow:hidden; } 这样就可以实现隐藏滚动条了 而且兼容目前所有的浏览器…

0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?

零基础如何自学Mysql创建数据库&#xff0c;是Mysql学习者必经之路&#xff0c;Mysql是受欢迎的关系数据库管理系统,WEB应用方面MySQL是很好的RDBMS应用软件之一。如何使用Mysql创建数据库表&#xff0c;打开Mysql学习进阶大门&#xff0c;就是今天MYSQL学习教程丁光辉博客认为…