小白怎么理解后端分层概念

发布时间:2026/5/25 1:46:16

小白怎么理解后端分层概念 我们来用一个通俗的比喻帮你理解后端分层把整个后端应用想象成一家餐厅。控制层Controller– 餐厅的服务员。负责接待客人前端请求记录客人要点什么菜参数然后把菜单交给后厨最后把做好的菜端给客人返回响应。服务层Service–厨师。负责具体的做菜流程业务逻辑比如这道菜需要哪些食材、烹饪顺序、加什么调料。厨师不会自己去买菜而是通知采购员。数据访问层Repository/DAO–采购员。负责去仓库数据库取食材、存储食材、更新食材。它只关心怎么和数据库打交道不关心菜怎么做。模型/实体层Model/Entity–菜单/菜品。定义了每道菜的组成数据结构比如菜名、价格、口味等。它贯穿各层让数据在不同的角色之间传递时保持格式统一。1. 各层详细说明控制层Controller作用接收 HTTP 请求解析参数调用 Service 层的方法并将 Service 返回的结果封装成 HTTP 响应。典型注解RestController、RequestMapping职责参数校验、响应格式转换、路由映射。不包含业务逻辑。服务层Service作用实现核心业务逻辑。比如计算订单总价、检查库存、调用多个 Repository 完成一个复杂事务。典型注解Service职责处理事务Transactional调用数据访问层组装业务对象。不直接处理 HTTP 细节。数据访问层Repository / DAO作用封装对数据库的 CRUD 操作。通过 JPA、MyBatis 等技术将对象映射到数据库表。典型注解Repository职责执行 SQL、查询结果、持久化数据。不包含业务逻辑。模型层Model / Entity / DTOEntity与数据库表一一对应的 Java 对象通常放在entity包。DTOData Transfer Object在层之间传输数据的对象比如 Controller 返回给前端的结构常与 Entity 分开避免暴露数据库字段。VOView Object专门用于前端展示的对象与 DTO 类似但更偏视图层。辅助角色Maven 与 Spring BootMaven项目构建工具。帮你管理 jar 包依赖如 Spring、数据库驱动并负责编译、打包成可运行的 jar/war。Spring Boot基于 Spring 的快速开发框架。它内置了 Tomcat 服务器通过“自动配置”让你不用手动配置大量 XML只需少量注解就能跑起一个项目。2. 数据流转与关系图下面是一个典型的请求处理流程用Mermaid 流程图展示。如果你在支持 Mermaid 的编辑器中查看可以直接渲染不支持时也可以看下方的文字描述前端发送 HTTP 请求控制层 Controller调用 Service 层服务层 Service调用 Repository 层数据访问层 Repository数据库返回 HTTP 响应给前端文字流程说明前端浏览器/App发起 HTTP 请求如POST /api/order。请求被Controller拦截根据 URL 路由到对应的方法。Controller 解析请求参数调用Service层的某个方法。Service 层执行业务逻辑可能调用多个Repository方法并利用Entity对象传递数据。Repository 使用 JPA 或 MyBatis 将操作翻译成 SQL与数据库交互。数据库返回结果Repository 将结果封装成 Entity 对象返回给 Service。Service 处理完毕后可能将 Entity 转换为DTO返回给 Controller。Controller 将 DTO 封装成 JSON 格式的 HTTP 响应返回给前端。3. 为什么这样分层解耦每一层只关心自己的职责修改数据库实现不影响业务层修改业务逻辑不影响接口。可测试可以对 Service 层单独做单元测试Mock Repository 即可无需启动数据库和 Web 服务器。维护性代码结构清晰新人能快速定位到某段逻辑的位置。复用性Service 可以被多个 Controller 复用Repository 可以被多个 Service 复用。4. 代码示例Spring Boot 风格Entity实体EntitypublicclassOrder{IdprivateLongid;privateStringproduct;privateIntegerquantity;// getter/setter...}RepositoryRepositorypublicinterfaceOrderRepositoryextendsJpaRepositoryOrder,Long{ListOrderfindByProduct(Stringproduct);}ServiceServiceTransactionalpublicclassOrderService{AutowiredprivateOrderRepositoryorderRepository;publicOrdercreateOrder(OrderDtodto){// 业务逻辑比如检查库存OrderordernewOrder();order.setProduct(dto.getProduct());order.setQuantity(dto.getQuantity());returnorderRepository.save(order);}}ControllerRestControllerRequestMapping(/api/orders)publicclassOrderController{AutowiredprivateOrderServiceorderService;PostMappingpublicResponseEntityOrdercreate(RequestBodyOrderDtodto){OrderorderorderService.createOrder(dto);returnResponseEntity.ok(order);}}5. 常见问题Controller 能不能直接调用 Repository可以但不推荐。因为业务逻辑会散落在 Controller 中一旦需要被另一个接口复用就会造成重复代码。Service 层专门收容业务逻辑。DTO 和 Entity 什么时候用一般 Entity 用于数据库映射DTO 用于对外传输避免暴露数据库字段或组合多个 Entity 的数据。Controller 接收前端参数时常用 DTO返回给前端时也常用 DTO。Maven 在这里起什么作用Maven 通过pom.xml声明项目依赖比如 spring-boot-starter-web、spring-boot-starter-data-jpa它会自动下载这些 jar 包并加入 classpath。你只需要写代码打包时用mvn package就能生成可运行的 jar。

相关新闻