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);
    }
}
相关推荐
水深火乐10 分钟前
安全地生成验证码、密码和 Token
后端
小强198822 分钟前
SQL Server 慢查询怎么定位?一套从“卡”到“快”的完整排查流程
后端
水深火乐24 分钟前
interface和any
后端
步行cgn25 分钟前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
yujunl28 分钟前
总结一下U9客开的成果
开发语言
神奇小汤圆28 分钟前
Spring Boot + LangChain4j实现RAG——从零搭建企业级知识库问答系统
后端
独隅28 分钟前
KMP 全栈进化:Koog 框架打造纯 Kotlin AI Agent 实战效果
开发语言·人工智能·kotlin
H_Peak32 分钟前
Python运算符与流程控制:if条件判断
后端
H_Peak35 分钟前
Python字符串操作:从基础到正则入门
后端
自进化Agent智能体35 分钟前
Hermes 子代理委派 —— 并行工作的艺术
后端