当前位置: 首页 > article >正文

Springboot的三层架构

        

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接口

package com.wzb.ThreeLevelsExercise20240919.Service;

import com.wzb.ResponseImprove20240919.Emp;

import java.util.List;

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

        Service实现类

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接口

package com.wzb.ThreeLevelsExercise20240919.Dao;

import com.wzb.ResponseImprove20240919.Emp;

import java.util.List;

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

        Dao实现类 

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层

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);
    }
}

 

 

 


http://www.kler.cn/a/311685.html

相关文章:

  • MySQL远程连接错误解决:Host is not allowed to connect to this MySQL server
  • leetcode206. Reverse Linked List
  • VCSVerdi:KDB文件的生成和导入
  • Sam Altman:年底将有重磅更新,但不是GPT-5!
  • 应用系统开发(1)涡流检测设备以及关键技术要点
  • Vue3 : Tailwindcss之margin样式类
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • HTML基础和常用标签
  • 【C++笔记】八、结构体 [ 3 ]
  • 如何着手创建企业数据目录?(一)数据目录的设定
  • python 实现area under curve曲线下面积算法
  • libserailport交叉编译适配说明
  • 胤娲科技:解锁AI奥秘——产品经理的智能进化之旅
  • 【每天学点AI】一个例子带你了解Python装饰器到底在干嘛!
  • C语言中的一些小知识(二)
  • Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
  • 算法题总结(三)——滑动窗口
  • MySql的基础讲解
  • Fisco Bcos 2.11.0配置console控制台2.10.0及部署调用智能合约
  • SpringAI-基于java大模型的胡言乱语
  • 正则表达式获取某些字段
  • docker快速搭建kafka
  • 【C++ Primer Plus习题】16.9
  • ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域
  • 数据结构---二叉树例题讲解
  • 基于深度学习的手势识别算法(论文复现)