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);
    }
}
相关推荐
DuelCode24 分钟前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
浪裡遊24 分钟前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
优创学社229 分钟前
基于springboot的社区生鲜团购系统
java·spring boot·后端
why技术32 分钟前
Stack Overflow,轰然倒下!
前端·人工智能·后端
幽络源小助理36 分钟前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码37 分钟前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot
lzb_kkk1 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
YuTaoShao1 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
好开心啊没烦恼1 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
ai小鬼头2 小时前
AIStarter如何助力用户与创作者?Stable Diffusion一键管理教程!
后端·架构·github