Spring Web 应用的最大败笔
来源:http://t.cn/EM8ROEb
开发人员在使用Spring应用时非常擅长谈论依赖注入的好处。不幸的是,他们没有真正的利用到它的好处,如单一职责原则,分离关注原则。如果我们一起来看看大部分Spring的Web应用程序,常见的错误的设计如下:
1.领域模型对象用来存储应用的数据(当作DTO使用),领域模型是贫血模型这样的反模式。
2.业务逻辑位于管理域对象数据的服务层中。
3.服务层每个实体有一个服务。
问题是这样很普遍,错误在哪里呢?
Spring的web应用程序之所以这样是因为他们做事的方式一直都是这样做的,老习惯难改,特别是如果他们是高级开发人员或软件架构师,这些人捍卫这样做的论据之一是:我们的应用程序遵循关注分离的原则,因为它已经被分为若干层,每个层都有自己的特定职责。
典型的SpringWeb应用程序具有以下几层:
1.Web层负责处理用户输入,并返回正确的响应给用户。 web层与服务层通信。
2.服务层作为一个事务边界,它也负责授权和包含我们的应用程序的业务逻辑。服务层管理领域模型对象,并与其他服务和存储层进行通信。
3.存储库/数据访问层负责与所使用的数据存储进行通信。
分离关注(Soc)是分离计算机程序为不同的部分,每个部分有一个关注聚焦,一个典型的Spring Web应用在一定程度上遵循这一原则,但现实是,该应用程序有一个整体的服务层,它有太多的责任。更具体地,服务层有两个主要问题:
1.在服务层发现业务逻辑
业务逻辑被分散在各个服务层。如果我们需要检查一个业务规则是如何实现的,我们必须先找到它。这可能并不容易。此外,如果相同的业务规则需要在多个服务类,问题是,规则需要从一个服务到另一个服务简单地复制。这将导致维护的噩梦。
2.每个领域模型一个服务
这完全违反了单一职责原则,它被定义为如下:单一职责原则指出,每一个类都应该有一个责任,责任应该由类完全封装。其所有的服务应该狭义与责任相一致。(不应将原属于领域模型的行为方法等划放在服务中实现,对象不但有属性还有行为)
服务类有很多依赖,以及大量的循环依赖。更像网络紧密耦合和单体服务。这使得很难理解,维护和重用。这听起来有点苛刻,但一个Spring的web应用的服务层往往是最容易出问题的部分。幸运的是,所有的希望都不会丢失。
1. 我们必须将我们的应用程序的业务逻辑从服务层迁移到领域模型类中。
举个例子:假设我是一个服务类,你是一个域模型对象。如果我让你从屋顶上跳下来,你会喜欢我这样的决定吗?(跳下来会摔伤,自己没有脑子或被洗脑,变成僵尸,只听从执行,不思考自己的安全,这就是贫血模型的问题)
将业务逻辑从服务层迁移到域模型类有下面三个优势:
(1)我们的代码将以逻辑方式切割,服务层只要关注应用逻辑,而我们的领域模型关注业务逻辑。
(2)业务逻辑只存在一个地方,容易发现修改。
(3)服务层的源代码是清洁的,不包含任何复制粘贴代码
2. 将每个实体服务切割为单一目标的更小的服务。
比如,有一个单一服务类,提供对人员和用户账户的CRUD操作,我们应该将它分为两个独立的服务类:
第一个是对人员的提供CRUD操作
第二个是提供与用户账户相关的操作。
好处:每个服务类中有一个逻辑组职责。每个服务类的依赖较少,这意味着他们不再是紧耦合的源头。他们是较小的和松耦合的组件。服务类更容易理解,维护和重用。
这两个简单的步骤将帮助我们使得我们的应用程序架构更干净,有助于同行开发商提高生产力。
Spring Web 应用的最大败笔相关推荐
- Spring web应用最大的败笔
第一篇 介绍下IOC DI Spring主要是业务层框架,现在已经发展成为一个完整JavaEE开发框架,它的主要特点是IoC DI和AOP等概念的融合,强项在面向切面AOP.推出之初因为Ioc/AOP ...
- Spring Web MVC(一)
概述 Spring Web MVC框架的特点 五大核心组件 编程步骤 五大核心组件 DispatcherServlet前端控制器 WebApplicationContext中特殊的bean 处理过程 ...
- 用Spring Web Flow和Terracotta搭建Web应用
什么是Spring Web Flow? Spring Web Flow是Spring Framework中的web应用组件,它提供了一种编写有状态和基于会话的web应用的简便手段.Spring Web ...
- 【Spring Web MVC】Spring Web MVC 注解开发环境搭建
为什么80%的码农都做不了架构师?>>> 1.创建maven项目 创建一个名为:springwebmvc-first的maven项目 2.添加依赖包 要使用springWebM ...
- MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 5
流控制文件很简单,就是根元素是<view>,然后用<view-state>来代表一个一个的页面,用<transition>来代表从一个状态到另外一个状态的跳转,如果 ...
- spring_了解Spring Web应用程序体系结构:经典方法
spring 每个开发人员必须了解两件事: 架构设计是必要的. 精美的架构图并未描述应用程序的真实架构. 真正的体系结构是从开发人员编写的代码中找到的,如果不设计应用程序的体系结构,最终将得到一个具有 ...
- spring初始化web_了解Spring Web初始化
spring初始化web 几年前,我们大多数人习惯到处编写XML配置文件,甚至可以设置简单的Java EE应用程序. 如今,使用Java或Groovy来配置项目已成为首选方式–您只需要看一下Sprin ...
- 强烈推荐Spring Web Flow权威指南
关于Spring Web Flow权威指南 评论 读后感:这是Spring Web Flow创始人写的书.内容是基于1.0的.此书原版出版时其实2.0已经推出了,为什么老大并没有追新呢?我猜想,书中写 ...
- Understanding Spring Web Application Architecture: The Classic Way--转载
原文地址:http://www.petrikainulainen.net/software-development/design/understanding-spring-web-applicatio ...
最新文章
- java:socket通信
- r型聚类典型指标_六种GAN评估指标的综合评估实验,迈向定量评估GAN的重要一步...
- UI-UIButton、UILable、UITextField总结
- vs生成qt moc文件
- jdk中提供的Collection、Collections、Collector、Collectors你分的清楚?
- python面试代码题_常见python面试题-手写代码系列
- BitMap 的基本原理和实现
- 【万字总结,花几分钟让你进一步了解指针】(学习笔记11--指针中)
- 布谷鸟哈希函数的参数_系统学习hash算法(哈希算法)
- ubuntu内网环境安装zabbix agent
- MSSQL coalesce系统函数简介
- 读书笔记|智能运维系统落地方案
- 确定权重的方法-主成分分析
- 按键精灵执行cmd命令_如何用cmd运行按键精灵脚本
- 一个程序员经历的7小时全身麻醉
- 海胆状聚苯乙烯与α-氧化铁复合结构微球/聚苯乙烯/氧化石墨烯/CNTs复合微球研究方式
- 两栈共享空间的存储结构设计
- 【计算机组成原理】CPU如何区分指令和数据
- C++算法:最大回文子串---动态规划-----夹逼法----中心扩展法
- 如何修复Windows 10中的声音问题
热门文章
- 实现基于渠道和buildType(debug,release)的打包
- nginx 如何处理请求系列1-Nginx安装
- Ubuntu16.10安装Ocata之4:Neutron
- Glide核心设计一:皮皮虾,我们走
- MINA2-TCP服务端实例
- VR可以用做除游戏外的哪些地方
- 前言 致Java开发学习前的一段话
- operamasks-ui2.0 +MVC4.0+EF5.0实战之一 开篇及布局控件介绍
- Flask-sqlalchemy外键关系映射
- Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer