Spring 术语中命令、表单、业务和实体对象之间的区别?

2024-05-24

我试图理解这些对象在松散耦合系统方面的差异。业务对象与实体对象相同吗?我可以使用 MVC 中的业务或实体对象作为我的命令对象吗?命令对象与表单对象相同吗?只是寻找 Spring 术语和用法中对象类型的说明。

我在 stackoverflow 上发现了一些问题,但没有一个能按照我的喜好解释它。

Spring Web MVC 文档似乎说您可以使用业务(实体?)对象作为命令/表单对象,但这不会违背关注点分离吗?

来自 Spring 文档:

可复用业务代码,无需重复。使用现有的业务对象作为命令或表单对象,而不是镜像它们来扩展特定的框架基类。


1) 从技术上讲,业务对象和业务实体(或您所说的“实体对象”)并不相同。

业务实体包含数据。而业务对象包含有关业务实体的逻辑(如何创建实体、如何更新实体等)。从技术上讲,业务对象是一种古老的 J2EE 模式,我在当前代码中还没有真正看到它,所以我无法详细介绍。有些人会说业务对象对应于 DAO,其他人则更愿意说服务。而一些开发人员只是说业务对象和实体是相同的,因为他们认为“对象”和“实体”具有相同的粒度,或者因为他们的业务实体也包含逻辑,或者只是因为他们不知道。我只是更喜欢谈论包含数据的对象的“(业务)实体”,并且我从不使用术语“业务对象”,因为它可以有不同的解释。

2) 根据 Spring MVC 文档,命令对象是一个 JavaBean,它将用表单中的数据填充。另一方面,什么是表单对象,不就是支持表单的对象吗?

所以是的,命令对象在语义上与表单对象相同。我更喜欢“形式对象”这个术语,我发现它很容易理解。

3)正如你所说,根据Spring MVC文档,该框架的一个特性是

可复用业务代码,无需重复。利用现有业务 对象作为命令或表单对象,而不是镜像它们延长 特定的框架基类。

所以,是的,你可以 - 而且根据 Spring 的说法,你应该 - 使用业务实体作为你的命令/表单对象。如果您不相信,以下是一些原因:

  • 为了简单起见。天知道我们的 Java 软件架构需要更加简单。有些公司使用太多的层​​来完成非常简单的事情。在 Spring、Java(见下文)等的领导下,人们采取了许多举措来应对这一问题。
  • 为了你自己,因为它让编程变得更简单、更轻松、更有趣
  • 因为 Spring 和 Java(通过 JSR)都这么说。事实上:我们对表单对象有何期望?表格支持和可能的一些验证。我们将如何进行此验证? Spring MVC 3 支持使用 JSR-303 @Valid 注释验证 @Controller 输入。我们将在哪里放置要验证的约束?根据 JSR-303,存储这些约束(@NotNull、@Length 等)的最佳位置是业务实体本身。底线:最好使用业务实体作为命令/表单对象。
  • 关注点分离仍然受到尊重。只是一个问题(形式支持)不再是问题了! Spring MVC 会为你处理它。 :-) 您只需要担心您的业务实体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 术语中命令、表单、业务和实体对象之间的区别? 的相关文章

随机推荐

  • 总结二维数组

    鉴于我当前的程序 我希望它在用户输入所有值后计算每列和每行的总和 我当前的代码似乎只是将数组的值加倍 这不是我想要做的 例如 如果用户输入具有以下值 1 2 3 2 3 4 3 4 5 的 3x3 矩阵 则看起来就像我在下面的程序中对其进行
  • Caliburn.Micro - ShowDialog() 如何关闭对话框?

    EDIT 新信息 刚刚设法让记录器工作 老实说 我不知道 cm 有一个 并且在尝试使用时收到此消息TryClose TryClose requires a parent IConductor or a view with a Close m
  • 为什么Google的闭包库不使用真正的私有成员?

    我成为 JavaScript 开发人员已经有一段时间了 我一直认为在 JavaScript 中实现私有成员的正确方法是使用 Doug Crockford 在这里概述的技术 http javascript crockford com priv
  • 当您处于飞行模式并退出飞行模式时,我只收到最后一条 FCM 推送通知?

    我只在退出飞行模式后收到最后的推送通知 FCM 但是 如果我的应用程序位于前台 一旦我离开飞行模式 我将收到所有推送通知 我已将 FCM 消息类型实现为通知消息 笔记 无法将 FCM 消息类型实现为数据消息 因为 APNS 只接受我的 iO
  • 捕获 SwiftUI 中的错误

    我在某些视图中有一个按钮 它调用 ViewModel 中可能引发错误的函数 Button action do try self taskViewModel createInstance name self name catch Databa
  • 为什么我应该在 ASP .Net MVC 应用程序中放弃使用 HTTPContext 会话状态的形式?

    我记得读过一些地方 人们不鼓励在 ASP Net Web 应用程序中使用 HTTPContext Current Session 状态 有人可以解释一下最近这一趋势背后的一些原因吗 A这有可靠的技术原因吗 谢谢 约翰 B 首先 MVC 不是
  • 确定代码是否在 App Engine 运行时 (Java) 上运行

    如何确定某些代码 Serv let 或简单的类 是否正在 Google App Engine 运行时 Java 上运行 以便决定是否使用 App Engine 的特定库 是否有一些可靠的运行时环境 ID 您可以检查com google ap
  • Android Studio 无法解析存储库

    在我的项目中 我尝试使用设计支持库 我的 Gradle 文件中有 dependencies compile com android support design 当我尝试构建这个时 我收到错误 通常我会点击Install Repositor
  • 使用 CSS 等高列

    我想对我的 CSS 表使用百分比 不幸的是 它对我不起作用 这段代码有什么问题 我应该使用 flexbox 而不是 table 吗 我想使用表格 因为我想要相同高度的列 ul list style none margin 0 display
  • sed 中的正则表达式用于在一条语句中进行多个替换

    我想清理一些输入并用可接受的输入替换几个字符 例如一个丹麦人 with aa 使用多个语句可以轻松完成此操作 例如 ae aa oe 但由于工具限制 我希望能够在单个正则表达式中完成此操作 我可以捕获所有相关案例 但我的替换不能按我想要的方
  • MongoDB:尝试从 JSON 读取 Long 导致 java.lang.Integer 无法转换为 java.lang.Long

    我有一个代码可以从 MongoDB 读取特定格式的数据 我需要测试一下 为此 我使用要测试的数据创建一个 JSON id ObjectId 57552e32e4b0839ede67e0af serial 574000690 startDat
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • 将node_modules安装到vendor

    如何在本地为每个项目安装 npm 模块vendor node modules和做package json文件看到他们 我不想将 package json 移动到供应商文件夹 我有凉亭 在 bowerrc我指定bower components
  • OpenIdConnect.nonce cookie 过多导致错误页面“错误请求 - 请求太长”

    我正在使用 OWIN OAuth 和 OpenId Connect 身份验证 Microsoft Owin Security OpenIdConnect 在 C ASP MVC Web 应用程序中 使用 Microsoft 帐户的 SSO
  • JSON 对象数组转 Java POJO

    将此 JSON 对象转换为 java 中的类 您的 POJO 类中的映射将如何 ownerName Robert pets name Kitty name Rex name Jake This kind of question is ver
  • flexslider 中的 GIF 滑块,如何仅在滑块上时开始 gif

    现在我有一个带有四个幻灯片的 Flexslider 第三个滑块是 gif 而不是像其他滑块一样是 jpg 我遇到的问题是 第三个 gif 滑块显然在到达页面时立即启动 而不是在您实际到达该滑块时启动 当点击前两个滑块时 gif 就快完成了
  • Karma + JSPM + Typescript - 未找到“.ts.js”

    主要只是想让 Karma JSPM 在加载 ts 文件时发挥良好作用 但绝对没有运气 我看到一个讨论库 https github com Larchy karma jspm typescript coverage tree master一个
  • 异步 JS 加载到 head 中

    我需要将脚本异步加载到页面上 我正在使用createElement方法在头部动态插入脚本标签 发生的事情是首先加载页面源 完成后 头部中包含的所有元素都会并行加载 一旦全部加载完毕 我动态添加的脚本就会加载 这在逻辑上是有道理的 但我正在寻
  • 监听外部事件。 Bash 到 NodeJS 的桥梁

    在 NodeJS 进程内部 我如何监听来自 bash 的事件 例如 NodeJS side obj on something function data console log data Bash side do something Hel
  • Spring 术语中命令、表单、业务和实体对象之间的区别?

    我试图理解这些对象在松散耦合系统方面的差异 业务对象与实体对象相同吗 我可以使用 MVC 中的业务或实体对象作为我的命令对象吗 命令对象与表单对象相同吗 只是寻找 Spring 术语和用法中对象类型的说明 我在 stackoverflow