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);
    }
}
相关推荐
【D'accumulation】11 分钟前
典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
java·设计模式·mvc
wn53121 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
试行26 分钟前
Android实现自定义下拉列表绑定数据
android·java
茜茜西西CeCe32 分钟前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
bjzhang7532 分钟前
SpringBoot开发——集成Tess4j实现OCR图像文字识别
spring boot·ocr·tess4j
Hello-Mr.Wang33 分钟前
vue3中开发引导页的方法
开发语言·前端·javascript
救救孩子把36 分钟前
Java基础之IO流
java·开发语言
flying jiang37 分钟前
Spring Boot 入门面试五道题
spring boot
WG_1737 分钟前
C++多态
开发语言·c++·面试
小菜yh38 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存