关于 Java 中的 DO、DTO、BO、AO、VO、POJO 有没有人能用一个接口的例子通俗的解释一下?

2022-02-16 11:06:25 +08:00
 itechnology
阿里巴巴 JAVA 开发手册是这样定义的:

DO ( Data Object ):与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO ( Data Transfer Object ):数据传输对象,Service 或 Manager 向外传输的对象。
BO ( Business Object ):业务对象。 由 Service 层输出的封装业务逻辑的对象。
AO ( Application Object ):应用对象。 在 Web 层与 Service 层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
VO ( View Object ):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
POJO ( Plain Ordinary Java Object ):在本手册中,POJO 专指只有 setter/getter/toString 的简单类,包括 DO/DTO/BO/VO 等。

但我感觉光看定义还是不容易理解,有没有人能用一个接口的来举个例子说一下
9431 次点击
所在节点    Java
53 条回复
NeoZephyr
2022-02-17 10:15:38 +08:00
@newskillsget 我们全部用的 map ,挺好的啊
NeoZephyr
2022-02-17 10:15:59 +08:00
@q474818917 你说哪个不内卷啊
Asuka0947
2022-02-17 10:24:27 +08:00
只用 entity ,vo ,bo ;偷懒 entity 一把梭了,忽略部分字段。
LowBi
2022-02-17 11:00:03 +08:00
偷懒了,太多了也太绕
awalkingman
2022-02-17 12:37:59 +08:00
@NeoZephyr 开发的时候时方便了,维护起来会要了老命(除非有及时更新的文档)
MonkeyJon
2022-02-17 15:49:58 +08:00
目前在用:
VO:用于跟前端对接的出参(返回结果)
DO:微服务之间的数据传输
POJO:只跟数据库交互使用
DTO:PO 满足不了的用 DTO 重写 PO 字段与数据库交互
AO:我们是 Query,前端传的入参,仅存在于 Controller 层
BO:我们命名为 Params ,query 转 params 才能进入 service 层
itechnology
2022-02-17 16:10:29 +08:00
@MonkeyJon 感谢解释
sknyyh
2022-02-18 10:38:42 +08:00
@lower Map 维护的时候,真的是火葬场
Uplay
2022-02-20 19:54:35 +08:00
@lululau 我们就用的 kotlin 感觉跟其他没什么区别
wshcdr
2022-02-22 12:10:06 +08:00
@qwe520liao AO 这里能举个例子不?
timethinker
2022-02-22 15:06:09 +08:00
@wshcdr 简单的来说,你可以把 Controller 里面的一些逻辑转移到一个 Application Object/Service 上。

分析一下原因,按理说每一个接口的逻辑应该是不同的,唯一的,但是不同接口之间可能也会复用到一些应用逻辑,如果这些逻辑在同一个 Controller 的不同的 Method 上( RequestMapping ),或许可以简单的创建一个私有的方法来搞定这些复用的逻辑。

但是对于不同 Controller 需要复用的逻辑,又不适合放在普通的 Service 上,就可以创建一个 Application Object/Service 来封装了,此时的顺序变成了:

Controller -> Application Object/Service -> (Domain)Service -> Repository/DAO 。

另外再说一些题外话,大部分人应该没有这些顾虑或者思考,看不懂的略过即可:

在 DDD 的战术模式中,领域服务( DomainService )一般只对单个聚合进行操作,且这些操作属于该领域自己的业务逻辑,只是不适合放到单个聚合上面,最重要的一点,聚合的任何操作都保证了不变性条件。

但是某一个业务需求可能会跨聚合进行操作,又要保证事务一致,就可能会在上层再建立一个应用层,注意我这里说的应用层跟 DDD 中的应用服务( ApplicationService )不一样,它跨聚合操作这种行为本身就是因为模型分析得不到位。因此这种逻辑是不推荐的,因为它模糊了限界上下文之间的关系,但是从编码角度来说却是很方便的。

想一想我有好几个 Service ,然后在 Controller 里面依次调用,只需要在 Controller 方法上加一个 @Transaction 的注解就可以保证事务一致,其中任何一个 Service 失败都将回滚数据,保证数据的一致性不被破坏。但其实这是一种偷懒的做法,或者说在是规模小的时候一种取巧省事的办法。
NeoZephyr
2022-02-23 10:35:07 +08:00
@newskillsget 也还好吧。每个人只关注自己往里面 put 的数据,别人 put 的都不动
rehoni
2022-04-28 08:45:02 +08:00
为什么米有 Qo ,不过我基本只用 QO,DTO,VO,ENTITY
QO:controller 接口接收的参数,POJO 类,用 oval 注解参数校验,至于直接用 QO 还是转换成 DTO 再给 service ,看心情...
DTO:service 单表,联表查询返回的对象,POJO 类,继承 ENTITY ,用 excel 注解实现导出
VO:特定约定返回给前端的结果用 VO ,从 DTO 做数据结构转换成 VO
ENTITY:实体类对应数据库

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/834173

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX