Java的分层架构设计与多个模块划分
一、Java分层架构设计(多层架构设计)
1、核心思想
- Java分层架构设计的核心思想是将应用程序划分为多个相对独立的层次,每个层次向上一层提供服务,并依赖下一层提供的服务。
2、优势
- 降低耦合度:减少层次间的依赖,降低系统复杂性。
- 提高可维护性:代码模块化,易于维护和调试。
- 增强可扩展性:新功能或修改只影响相应层次。
- 提高代码重用性:封装通用服务和工具类,提高代码复用。
3、主干层次划分
以下是最常见也常用的分层架构设计
1. 表示层(Presentation Layer)
- 职责:与用户交互,接收输入,展示结果。
- 实现:Java Web应用使用Servlet、JSP、Spring MVC等;移动应用使用原生开发技术。
- 对应:controller层,处理HTTP请求,返回响应。
2. 业务逻辑层(Business Logic Layer, BLL)
- 职责:处理核心业务逻辑,接收表示层请求,调用数据访问层,返回处理结果。
- 实现:Java类或接口,使用Spring等框架进行依赖注入和事务管理。
- 对应:service层,包含业务逻辑实现,调用数据访问层。
3. 数据访问层(Data Access Layer, DAL)
- 职责:与数据库交互,提供增删改查操作。
- 实现:JDBC、Hibernate、MyBatis等持久化框架。
- 对应:dao(有时也称为mapper)层,执行SQL查询、更新、删除等操作,使用实体类表示数据库结构。
4. 实体层(Entity Layer)
- 职责:表示数据库数据结构,包含相关属性和方法。
- 实现:Java Bean或POJO,通过注解或XML与数据库表映射。
- 对应:entity(有时也称为model或pojo)层,与数据访问层紧密相关,也可被业务逻辑层和表示层使用。
5. 工具层(Util Layer)
- 职责:提供通用、静态的工具类或方法,执行常见任务。
- 实现:包含字符串处理、日期计算等便捷方法。
- 对应:util层,应用程序任何地方可调用。
6. 公共层(Common Layer)
- 职责:包含公共接口、常量、异常处理等共享元素。
- 实现:减少代码重复,提高可读性和可维护性。
- 对应:common层,应用程序不同部分间共享。
当然也会有其他的个性化的层级划分,在此就不多说了
4、对象类型(基本概念)
数据流转对象
- VO(值对象):主要用于展示层,封装了页面或组件所需的数据。VO通常不包含业务逻辑,只是数据的容器。
- DTO(数据传输对象):用于不同层或系统之间的数据传输。DTO可以包含多个VO或Entity的属性,用于组装和传输复杂的数据结构。
- PO(持久化对象):与数据库表结构相对应,用于持久化数据。在ORM框架中,PO通常与Entity是同义词,但在某些上下文中,PO可能更侧重于表示与数据库交互的对象。
业务逻辑对象
- DO(领域对象):反映了业务需求和领域知识的本质,是业务流程中的实体对象。DO通常包含业务逻辑和状态,是业务层的核心。在某些项目中,DO可能与PO或Entity重合,但在更复杂的项目中,它们可能是分离的。
- BO(业务对象):封装了业务逻辑和行为,是业务层的核心。BO通常包含对DO的操作和业务流程的实现,是连接展示层和数据访问层的桥梁。
简单性
- POJO(简单的Java对象):没有任何特殊的要求或约束。POJO可以是上述任何对象类型(vo/dto/po/do/bo)的统称,但在实际命名中,我们通常会避免使用
xxxPOJO
这样的命名方式,因为它缺乏明确的语义。这个也可以成为层次化的概括
5、对象类型的层次化概括
- Entity(实体):通常与数据库表相对应,表示持久化存储的数据。在JPA或Hibernate等ORM框架中,实体类通过注解与数据库表进行映射。
- Model(模型):是一个更广泛的概念,它可以表示业务逻辑、数据访问和数据展示等多个方面的抽象模型。Model可以包含Entity、VO、DTO等不同类型的对象,以及它们之间的关系和业务逻辑。
总结:
分层对象流转流程
控制层(接收)——》业务层(与持久层沟通)——》控制层(返回前端)
非严格标准的情况下:
全用 持久化实体类entity(或者pojo) 即可。缺点:会可以导致库表结构泄露,因为对外展现了
严格标准的情况下:
控制层(接收)使用dto;业务层(与持久层沟通)使用 entity(或者pojo);制层(返回前端)使用vo
我一般在分层创建包时会选择使用entity(或者pojo)、dto、vo 三包
也可以使用model包来包裹entity(或者pojo)、dto、vo 三包。
看个人习惯
就这么说吧,就现阶段来说
喜欢 用pojo层 或者entity层 来存放 与数据库表对应的类
Model层 更广义的概括,可以存Entity、VO、DTO 的相关类
二、多模块划分
一般来说:模块划分涉及到业务、功能点进行相关划分
1. 单个module
以SpringBoot为例子,单个module内的最传统划分如下:
2. 多个module
方式一
特点:把启动的main单独冲出来了,其余的还是按传统分层进行模块化
结构参考来源:JavaDog程序狗 博主
方式二
特点:按业务模块分,不用和其他人动同一个包
结构参考来源:IT利刃出鞘 博主
其中项目结构逻辑实现方式有很多种,在这里 记录和参考一下 别人思考的方式。
无所谓好坏,场景不同,方向就不同