Springboot的三层架构

java 复制代码
package com.wzb.ThreeLevelsExercise20240919;

public class Exercise {
    // 内聚:内聚是指一个模块或内部各元素的紧密程度。高内聚则是一个模块或类中的所有功能都是紧密相关的,专注于完成单一任务
    // 高内聚的好处:
    // 1.易于维护:因为模块内的功能高度相关,所以说修改一个功能不会影响到其他不相关的功能,便于业务的变动和代码的维护
    // 2.可复用性强:高内聚的模块通常功能明确,所以说易于在不同的项目中进行复用

    // 耦合:耦合是指不同的模块或类之间的依赖程度。低耦合则意味着各个模块或类之间的依赖关系较少,彼此独立、互不影响
    // 低耦合的好处:
    // 1.易于修改:因为低耦合,各个模块或类的依赖关系较少,所以说修改一个模块不会对其他模块有重大影响
    // 2.提高灵活性:模块之间的独立性增强,可以更加容易的替换和升级某个模块

    // 软件开发的要求:高内聚,低耦合

    // 三层架构
    // 在进行程序设计极其开发的过程中,尽可能使每一个接口、类、方法的职责单一(单一职责原则):复杂度降低、可读性提高、扩展性更好
    // 一般在开发中,服务端可以分为三层架构

    // 1.数据访问(Dao):负责业务数据的维护操作,包括对于数据的增、删、改、查
    // 2.逻辑处理(Service):负责业务逻辑处理的代码
    // 3.请求处理、响应数据(Controller):负责、接收页面的请求;给页面响应数据

    // Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据
    // Service:业务逻辑层。处理具体的业务逻辑
    // Dao:数据访问层(Data Access Object),也称为持久层,负责数据访问的操作,包括数据的增、删、改、查

    // 基于三层架构程序的执行流程:
    // 1.前端发起请求,由Controller层接收
    // 2.Controller层调用Service层进行逻辑处理(Service层处理完成之后,会将结果返回给Controller层)
    // 3.Service层调用Dao层(逻辑处理过程中需要用到的数据需要从Dao层中获取)
    // 4.Dao层操作文件(数据库)中的数据(Dao层拿到的数据返回给Service层)

    // 按照三层架构的思想,若对业务逻辑层进行变更,不会影响到控制层和数据访问层
    // 对应的代码要写在对应的包名中------------
    // 控制层包名:xxxx.controller
    // 业务逻辑层包名:xxxx.service
    // 数据访问层包名:xxxx.dao
}

Service层

Service接口

java 复制代码
package com.wzb.ThreeLevelsExercise20240919.Service;

import com.wzb.ResponseImprove20240919.Emp;

import java.util.List;

// 业务接口
public interface EmpService {
    // 获取员工列表
    public List<Emp> listEmp();
}

Service实现类

java 复制代码
package com.wzb.ThreeLevelsExercise20240919.Service;

import com.wzb.ResponseImprove20240919.Emp;
import com.wzb.ThreeLevelsExercise20240919.Dao.EmpADao;
import com.wzb.ThreeLevelsExercise20240919.Dao.EmpDao;

import java.util.List;
import java.util.function.Consumer;

// 业务实现类
public class EmpAService implements EmpService{
    // 获得dao层对象
    private EmpDao empDao = new EmpADao();

    // 按照业务逻辑处理员工数据
    @Override
    public List<Emp> listEmp() {
        // 1.调用dao层,获取数据
        List<Emp> empList = empDao.listEmp();

        // 2.按照业务逻辑,对得到的数据进行处理
        empList.stream().forEach(new Consumer<Emp>() {
            @Override
            public void accept(Emp emp) {
                String gender = emp.getGender();
                if (gender.equals("1")) {
                    emp.setGender("男");
                } else if (gender.equals("女")) {
                    emp.setGender("女");
                } else {
                    emp.setGender("Error");
                }

                String job = emp.getJob();
                switch (job) {
                    case "1" -> emp.setJob("讲师");
                    case "2" -> emp.setJob("班主任");
                    case "3" -> emp.setJob("就业指导");
                    default -> emp.setJob("Other");
                }
            }
        });
        // 返回员工表
        return empList;
    }
}

Dao层

Dao接口

java 复制代码
package com.wzb.ThreeLevelsExercise20240919.Dao;

import com.wzb.ResponseImprove20240919.Emp;

import java.util.List;

// 数据访问层接口(指定标准)
public interface EmpDao {
    // 获取员工列表数据
    public List<Emp> listEmp();
}

Dao实现类

java 复制代码
package com.wzb.ThreeLevelsExercise20240919.Dao;

import com.wzb.ResponseExercise20240919.utils.XmlParserUtils;
import com.wzb.ResponseImprove20240919.Emp;

import java.util.List;

public class EmpADao implements EmpDao {
    @Override
    public List<Emp> listEmp() {
        // 加载并解析emp.xml文件,然后返回数据
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
        return empList;
    }
}

Controller层

java 复制代码
package com.wzb.ThreeLevelsExercise20240919.Controller;

import com.wzb.ResponseExercise20240919.Result.Result;
import com.wzb.ResponseImprove20240919.Emp;
import com.wzb.ThreeLevelsExercise20240919.Service.EmpAService;
import com.wzb.ThreeLevelsExercise20240919.Service.EmpService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

// 控制层:接收前端发送的请求,对请求进行处理,并响应数据
@RestController
public class EmpController {
    // 获得业务层对象
    private EmpService empService = new EmpAService();

    @RequestMapping("/listEmpTogether")
    public Result list() {
        // 调用service层,获取数据
        List<Emp> empList = empService.listEmp();
        // 响应数据
        return Result.success(empList);
    }
}
相关推荐
陈随易2 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
Highcharts.js2 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
鱼樱前端2 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
犀利豆3 小时前
Claude code tools 研究系列-开篇(AskUserQuestion)
后端
头发还在的女程序员3 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats3 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123454 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
爱写代码的小朋友5 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华5 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
颜酱6 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端