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层打包

spring api层打包_Spring项目的按层打包已过时相关推荐

  1. webpack 打包ts项目_使用webpack打包ts

    初始化package.json npm init -y cnpm i -D webpack webpack-cli(webpack命令行工具) typescript ts-loader(整合) 2.1 ...

  2. 【新】使用setuptools打包Python项目

    如何使用setuptools打包Python项目 如何使用setuptools打包Python项目 一.准备 二.项目结构 三.简单打包 3.1 文件内容 3.2 打包项目 3.3 安装测试 四.自定 ...

  3. Spring Boot——AbstractWebSocketMessageBrokerConfigurer已过时解决方案

    问题描述 Spring Boot2.0及以上版本,编译器显示AbstractWebSocketMessageBrokerConfigurer已过时. 官方文档 https://docs.spring. ...

  4. Spring Boot——WebMvcConfigurerAdapter已过时解决方案

    问题描述 Spring Boot2.0及以上版本,编译器显示WebMvcConfigurerAdapter已过时. 问题分析 暂无. 解决方案 实现WebMvcConfigurer接口 @Config ...

  5. Spring Boot 多模块项目实践(附打包方法)

    序言:比起传统复杂的单体工程,使用Maven的多模块配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特殊控制更为方便. ...

  6. maven多模块合并打包_Spring Boot 多模块项目实践(附打包方法)

    一.创建聚合父工程 二.创建子模块(module) 三.编写子模块代码 三.运行项目 四.运维部署(多模块打包) 1. 添加打包插件 2. 打包工程 3. 启动项目 <Java 2019 超神之 ...

  7. Spring Boot + Vue前后端分离项目,Maven自动打包整合

    前言 现在各类项目为了降低项目.服务模块间的高度耦合性,提出了"前后端分离",而前后端分离的项目该如何打包呢? 一般的做法是前端项目打包完,将打包文件手动复制到后端项目工程的src ...

  8. spring boot 前后端分离项目(商城项目)学习笔记

    spring boot 前后端分离项目(商城项目)学习笔记 目录 spring boot 前后端分离项目(商城项目)学习笔记 后端配置 springboot项目 pom.xml文件 maven 配置文 ...

  9. spring el表达式解析_Spring之旅第一篇-初识Spring

    目录 一.概述 二.模块 三.动手创建 一.概述 只要用框架开发java,一定躲不过spring,Spring是一个轻量级的Java开源框架,存在的目的是用于构建轻量级的J2EE应用.Spring的核 ...

最新文章

  1. 营销型网站优化攻略分享
  2. Delphi Form Designer (窗体设计器)之二
  3. Linux I2C子系统分析之(一) ----- 用GPIO模拟I2C总线
  4. HttpClient和HttpURLConnection的使用和区别(上)
  5. Ambari2.7.4+HDP3.1.4.0中配置fair-scheduler
  6. Dapr牵手.NET学习笔记:发布-订阅
  7. Java LineNumberReader mark()方法与示例
  8. 万份销量,五星好评!这门Python神作刷爆朋友圈!
  9. python怎么读取txt文件-Python三种读取txt文件方式
  10. 《游戏人工智能编程》读书笔记 —— 向量的归一和点乘
  11. LoadingCache源码剖析之缓存加载实现
  12. 2.4 分块矩阵(第2章矩阵代数)
  13. 《菊与刀》读后感作文5000字
  14. codeforces1467D. Sum of Paths
  15. 通俗易懂解释raid0和raid5_raid0和raid5区别是什么?
  16. matplotlib plot画图不弹框
  17. 艾司博讯:拼多多客单价怎么提高
  18. 如何用python画一个美队盾牌
  19. 【数学】高昆轮高数下强化
  20. php汉字占几个字节,php一个汉字几个字节

热门文章

  1. P5025-[SNOI2017]炸弹【tarjan,线段树优化建图】
  2. 欢乐纪中某B组赛【2019.1.29】
  3. ssl1072-砝码称重【dp练习】
  4. 【模拟】游戏(jzoj 1614)
  5. 动态规划训练13 [Catch That Cow poj3278]
  6. Java8使用 Optional 处理 null
  7. C++描述杭电OJ 2020.绝对值排序 ||
  8. [编程入门]阶乘求和:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
  9. MyBatis中的原理
  10. MyBatis(延迟加载 缓存)