spring api层打包_Spring项目的按层打包已过时

spring api层打包

我认为Spring应用程序不应该以逐层方法构造。 在我看来,按功能打包更有意义。

首先,让我简要描述每种方法。

“按层打包”(在非Java世界中为“按类型折叠”)

该项目结构根据源代码文件所属的体系结构层将其分为包/目录:

.
└── net└── lkrnac└── blog├── Application.java├── persistence│   ├── ProjectRepository.java│   └── UserRepository.java├── dto│   ├── ProjectDto.java│   └── UserDto.java├── model│   ├── Project.java│   └── User.java├── service│   ├── ProjectService.java│   └── UserService.java└── web├── ProjectController.java└── UserController.java

“按功能打包”(非Java世界中的“按功能折叠”)

另一方面,此方法将属于系统内某些功能的文件组合在一起:

.
└── net└── lkrnac└── blog├── Application.java├── project│   ├── ProjectController.java│   ├── ProjectDto.java│   ├── Project.java│   ├── ProjectRepository.java│   └── ProjectService.java└── user├── UserController.java├── UserDto.java├── User.java├── UserRepository.java└── UserService.java

发展趋势

这个话题使我很久了。 当我用谷歌搜索“按层打包”还是“按功能打包”还是“按类型打包”还是“按功能打包”时,“按功能”结构的支持者似乎越来越多。 我也在这个营地。

但是不仅应用程序开发人员是它的支持者。 Angular(最著名的Single Page Application框架之一)正在其样式指南中推广这种文件夹结构。

Spring项目结构

由于有很多关于每种方法的利弊的文章,我将重点介绍对Spring项目的影响。

放下Spring CRUD应用程序的传统结构(如果您的后端应用程序未使用Spring Data REST)分为三层:Web /服务/持久性。 我从事的大多数Java / Spring项目都遵循这种结构。

耦合

逐层封装很可能起源于上个世纪,在那里分层结构被用作去耦机制。 实际上,当我挑战逐层结构时,“解耦”通常是答案。 我不同意。 对我来说,逐层封装是导致紧密耦合的主要原因之一。

在逐层结构化项目中为类编写签名时,第一个关键字是什么? 我敢打赌这是公开的。 公共访问修饰符是否有助于解耦? 我想没有人会回答 这个问题。

为什么开发人员到处使用公共访问修饰符? 正是因为该项目是以分层方式构造的。 存储库类需要是公共的,因为它需要从服务包中进行访问,而服务也必须是公共的,因为需要从Web包中进行访问。 当一切都公开时,很难维持纪律,不会导致大的泥潭。

使用按功能打包时,私有UserRepository包私有(这意味着未指定访问修饰符)不能由UserService以外的其他服务使用,因为它们位于同一包中。 而且,如果我们决定仅UserController应该使用UserService,则将其打包为私有,因为它们共享同一包。 在这样的项目结构中,大多数类都是包私有的。 因此,开发人员应该有充分的理由公开课堂。

缩放比例

如果项目在Web /服务/持久层中开始具有10多个类,会发生什么情况? 开发人员倾向于将类分组为子包。 但是他们如何对它们进行分类? 根据我的经验,它主要基于功能。 因此,我们经常可以在较大的项目中找到这样的结构:

.
└── net└── lkrnac└── blog├── Application.java├── dao│   ├── ...other repositories...│   ├── ProjectRepository.java│   └── user│       ├── UserRepository.java│       └── UserRoleRepository.java├── dto│   ├── ...other DTOs...│   ├── ProjectDto.java│   └── user│       ├── UserDto.java│       └── UserRoleDto.java├── model│   ├── ...other models...│   ├── Project.java│   └── user│       ├── User.java│       └── UserRole.java├── service│   ├── ...other services...│   ├── ProjectService.java│   └── user│       ├── UserRoleService.java│       └── UserService.java└── web├── ...other controllers...├── ProjectController.java└── user├── UserController.java└── UserRoleController.java

这不是明显的疯狂吗?

未来的证明

正如一群聪明人所建议的那样, 用微服务体系结构启动绿色领域项目可能不是一个好主意 。 我同意。 因此,如果您的应用程序增长Swift,则准备将整体组件最终分成较小的项目可能是个好主意。

想象一下,您将需要从整体项目中提取微服务。 或将整个项目拆分为微服务。 我希望每个人都理解,没有理智的微服务架构被架构层分开。 使用基于特征的分离。 那么哪种项目结构将更容易划分为微服务? 一个,在哪里任何公共类都可以使用任何包中的任何其他公共类(逐层打包)? 还是一个,分成软件包专用存储桶(按功能分组)? 我相信答案是显而易见的。

结论

按功能打包是一种简单但非常强大的去耦机制 。 因此,下一次某位痴迷的开发人员将作为解耦机制逐层捍卫项目结构时,请纠正她/他的误解。 我相信恐龙般的性格是当今仍然存在逐层包装的唯一原因。

翻译自: https://www.javacodegeeks.com/2018/02/package-layer-spring-project-obsolete.html

spring api层打包

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

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

相关文章

C++ Primer(第五版)第七章 类 部分答案

第七章 类练习7.2练习7.3练习7.4练习7.6练习7.7练习7.9练习7.14、7.15、7.22练习7.23、7.24、7.26练习7.27练习7.2 曾在 2.6.2 节的练习(第 76 页)中编写了一个 Sales_data类,请向这个类添加 combine 和 isbn 成员。 创建头文件sales.h #ifn…

arpanet(阿帕网)

“阿帕”(ARPA),是美国高级研究计划署(Advanced Research Project Agency)的简称。他的核心机构之一是信息处理技术办公室(IPTO Information Processing Techniques Office),一直在关…

mongodb数据库淘汰_mongodb 内存数据淘汰策略

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼About MongoMongoDB uses memory mapped files.This means the the operating system essentially controls what is paged in and out of memory (to and from disk).The RulesIf your indexes working set exceed memory, the l…

Markdown常用转义字符

如果字符无法正常输出,则在前面加\试试。 空格: 数学公式 数学公式要使用$$,需将公式放在两个$中间。 下标: _上标: ^分数:方法1:\frac{分子}{分母} 方法2:分子 \over 分母 对于\frac的方法…

互联网工程任务组(IETF)

国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)是一个公开性质的大型民间国际团体,汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员,并欢迎所有对此行业感兴趣…

javafx 打印控件_Java的新视差控件(JavaFX)

javafx 打印控件介绍 视差是一种视觉效果,您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下,当您在道路上行驶时,您会看到附近的树木在快速移动,而距离较远的树木将沿同一方向移动但速度较慢,结果是您…

beoplay耳机序列号查询_BOSE耳机序列号如何查询?

展开全部 大多数序列号可在产品的背面或底部找到,一般位于条形码旁。e69da5e6ba903231313335323631343130323136353331333431363532序列号长度为 17 位(还有一些耳机是 4 位),可包含字母和数字。 另外,与 Bose Connect 应用程序兼容的产品将在应用程序的设置和gt; 产品信息下…

编译原理总概述笔记

编译原理编译原理程序设计语言分类翻译编译解释编译的转换过程两阶段的转换三阶段的转换编译程序的工作词法分析语法分析中间代码生成优化目标代码生成表格与表格管理出错处理语句翻译实例过程编写编译程序方式编译原理 是介绍高级程序设计语言变换成计算机硬件所能识别的机器…

RFC(一系列以编号排定的文件)

Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内…

deprecated_使用Java的@Deprecated前瞻

deprecated我偶尔会遇到一种情况,我需要引入新的API或构造以供其他人试用,但是我知道在使用某些API后,它可能会根据其他人的反馈而改变。 在这种情况下,我想以某种方式注释该构造,以警告其他开发人员此新添加的构造的暂…

fusionsphere的核心组件_FusionSphere架构详解

FusionSphere架构详解关键字:云计算XEN Hypervisor FusionSphere摘要:本技术案例主要针对Huawei FusionSphere云计算软件架构进行深入分析,总结概括出我们的FusionSphere云计算产品技术及课程内容中的关键点,为产品技术学习和云计…

将py文件打包成exe可执行文件

使用pyinstaller库即可将py文件打包成exe文件 安装pyinstaller库 pip install pyinstaller将py文件打包成exe文件 1.首先进入cmd,用cd命令定位到要打包的py文件所在的文件夹 2.使用以下命令打包py文件 pyintaller -F xxx.py #xxx.py就是要打包的文件之后会生成…

文件的 MD5 签名介绍

在 RFC1321 中有 MD5 的详细描述。简单的说,MD5 根据文件的内容用算法产生一个唯一的128位签名,用任何方法改变文件都会导致签名改变。尽管人们一直在讨论修改文件后能保持签名不变的理论可能性,但截止到目前还没有人能够做到。所以在文件使用…

apache.camel_Apache Camel 2.21发布–新增功能

apache.camel我们刚刚发布了Apache Camel 2.21,我将在此博客中重点介绍值得注意的更改。 此版本不支持Spring Boot2。对Spring Boot 2的支持将在Camel 2.22中提供, 我们计划在2018年夏季之前发布。 1)处理大型JMS消息 我们在JMS组件中添加了…

人生永无止境的意思是什么_励志人生:生活不会给任何脆弱鼓掌。

每一日你所付出的代价都比前一日高,因为你的生命又消短了一天,所以每一日你都要更积极。今天太宝贵,不应该为酸苦的忧虑和辛涩的悔恨所销蚀,抬起下巴,抓住今天,它不再回来。一个人失败的最大原因&#xff0…

精通 RPM 之校验篇_检验篇_检测篇

文章目录一、校验介绍二、参考示例(一)校验某个已安装的软件包的所有文件(一)校验系统中所有已安装的软件包(二)校验含有指定文件的软件包(三)校验指定类别的软件包(四&a…

python关于路径需使用的方法笔记

关于python中有关路径实现代码的方法常用的python方法join()方法split()方法关于文件路径\ / // \\的用法解释斜杠/反斜杠\读取某个路径的文件双斜杠//双反斜杠\\\os.path库的方法连接路径与路径或文件名获取绝对路径获取当前文件的绝对路径返回文件名字返回文件所在文件夹的路…

不同的Hibernate命名策略

本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后,我们将研究一下在Hibernate和配置中实施自…

设置按峰值带宽计费_西部数码使用指南:云服务器计费模式说明

版权归西部数码所有,原文链接:https://www.west.cn/faq/list.asp?unid2370一、付费模式1、包年包月先付费后使用模式,资源固定,按年或者按月付费购买可享受较大的价格优惠,帮您更大程度节省支出,并且时间固…

信号处理基本概念

信号处理 信号是传递信息的函数,也是独立变量的函数,这个变量可以是时间空间位置等。如图像的灰度值等就是空间位置的函数,声压随着时间在变化,就是时间的函数。 连续信号就是在某个时间区间,除有限间断点外所有瞬时…