Spring项目的按层打包已过时

我认为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(最著名的单页应用程序框架之一)正在其样式指南中推广此类文件夹结构。

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

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

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

相关文章

css怎么控制两个字母,css英文字母数字自动换行且不断词方法

本文章来给各位同学介绍css怎样让英文字母数字自动换行且不断词方法总结,有需要了解的同学可进入参考。当一个定义了宽度的块状元素中填充的全部为纯英文或者纯数字的时候,在IE和FF中都会撑大容器,不会自动换行并且当数字或者英文中带有汉字时…

nmap 查看服务器版本信息,nmap命令-nmap命令扫描服务器信息的格式

用这条命令就可以扫描出目标网络的操作系统和开放端口号nmap-O...0/24上面的扫描信息直接输出到终端,如果想把结果写到文件里,可以用-oN,-oX选项输出到文本文件或xml文件。nmap-O...0/24-oXnmap_info.xml,结果会输出到XML文件&…

java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数

java构造函数内部调用关于Java内部类 Java允许成员类(在其他类内定义的类),局部类(在语句块内定义的类)和匿名类(无名称的类): class Outer {Object anonymous new Object(){}; //…

Java的新视差控件(JavaFX)

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

ajax提交file空指针,excel导入上传文件报空指针错误

页面入口全选导入导出${msg[globals.button.delete.more]}导出jsfunction excelImport() {top.layer.open({type: 1,area: [500, 300],title:"导入数据",content:$("#importBox").html() ,btn: [下载模板,确定, 关闭],btn1: function(index, layero){windo…

mockito 静态方法_Mockito –带有注释和静态方法的额外接口

mockito 静态方法在代码中,我最近遇到了一段非常糟糕的代码,该代码基于对对象执行某些操作的类转换。 当然,代码需要重构,但是如果您首先没有对该功能进行单元测试,则有时您可能无法做到/或者不想这样做(这…

手机推送信息到本地服务器,服务器信息推送到手机

服务器信息推送到手机 内容精选换一换服务器的计费方式为“包年/包月”,如果在计费周期内不想再继续使用,请参考本节指导进行退订。执行退订操作前,请确保待退订的服务器数据已完成备份或者迁移,退订完成后资源将被完全删除&#…

怎么修改服务器上的cpt文件,DELL-服务器-RAID-配置详解(28页)-原创力文档

DELL 服务器 RAID 配置详解磁盘阵列可以在安装系统之前或之后产生,系统会视之为一个(大型)硬盘,而它具有容 错及冗余的功能。磁盘阵列不单只可以加入一个现成的系统,它更可以支持容量扩展,方 法也很简单,只需要加入一个…

Apache Camel 2.21发布–新增功能

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

linux下网站服务器,Linux下使用Apache搭建Web网站服务器(示例代码)

[[email protected] ~]# yum install elinks –y主配置文件[[email protected] ~]# ls/etc/httpd/conf/httpd.conf/etc/httpd/conf/httpd.conf#我们又是怎么知道httpd的注配置文件是在你那里的呢?查看httpd注配置文件位置[[email protected] ~]# rpm -pql/mnt/Packa…

程序内存泄露监视_监视和检测Java应用程序中的内存泄漏

程序内存泄露监视因此,您的应用程序内存不足,您日夜不停地分析应用程序,以期捕获对象中的内存漏洞。 后续步骤将说明如何监视和检测您的内存泄漏,以确保您的应用程序处于安全状态。 1.怀疑内存泄漏 如果您怀疑有内存泄漏&#xf…

服务器可以装两个系统吗,云服务器可以装多个系统吗

云服务器可以装多个系统吗 内容精选换一换示例:购买并登录Windows弹性云服务器示例:购买并登录Linux弹性云服务器云平台提供了多种实例类型供您选择,不同类型的实例可以提供不同的计算能力和存储能力。同一实例类型下可以根据CPU和内存的配置…

与Spring的计划任务一起按时运行

您是否需要每天像闹钟一样在同一时间运行某个流程? 然后,Spring的预定任务适合您。 允许您使用Scheduled注释方法,以使其在指定的时间或内部间隔运行。 在本文中,我们将研究如何设置一个可以使用计划任务的项目,以及如…

jboss url路径_在JBoss的服务器端正确解码URL参数

jboss url路径我今天花了很多时间来弄清楚如何在运行在JBoss上的JSF应用程序中(使用JBoss 7 Final)强制正确解码编码的字符。 当您有例如通过URL传递中文字符时,就会发生此问题。 假设您有指点事件,编码为%E6&#xff…

在JDK 10中不可变与不可修改

大约两个月前, 斯图尔特马克斯 ( Stuart Marks)写道:“ 不变性就像葡萄酒 。” 然后,他提醒读者注意叔本华的熵定律 :“如果将一勺酒倒入装满污水的桶中,就会产生污水。 如果将一勺污水倒入装满…

@async方法不调用了_在Spring中使用Future对象调用Async方法调用

async方法不调用了下一个示例将演示Spring容器内部的异步方法调用。 为什么我们需要异步方法调用? 在某些情况下,我们并不真正知道是否需要重播或何时应返回结果。 传统方式在Java EE世界中处理异步调用的方法是使用队列/主题。 我们可以在Spring中进行相…

不同的休眠命名策略

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

基于FPGA,如何用Verilog HDL实现64位宽的扰码器?附上仿真结果。

文章目录前言一、扰码器1、什么是扰码器2、扰码的原理3、产生扰码的多项式二、Scrambler的Verilog实现1、scrambler.v2、scrambler_tb.v三、仿真结果四、总结前言 在数字信号处理系统中,因为发送端的数字信号序列可能会出现很长一段都是“0”,或很长一段…

基于FPGA,解扰码器Verilog的实现,以及扰码器与解扰码器的联合仿真。附上仿真结果。

文章目录前言一、扰码器二、解扰码器三、Descrambler的Verilog实现1、descrambler.v2、descrambler_tb.v四、扰码器与解扰码器的联合仿真1、scrambler_test.v2、scrambler_test_tb.v3、联合仿真结果五、总结前言 在数字信号处理系统中,因为发送端的数字信号序列可能…

光纤通信系统简介

文章目录前言一、直接检测光通信系统二、相干光通信系统三、直接检测与相干检测1、直接检测2、相干检测3、相干检测的优缺点(1)相干检测的缺点(2)相干检测的优点总结参考文献前言 光通信系统的基本组成结构如下图所示。光通信系统…