SpringBoot之三层架构的详细解析

发布时间:2023年12月19日

3. 分层解耦

3.1 三层架构

3.1.1 介绍

在我们进行程序设计以及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。

单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。

这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利用后期的维护。

我们之前开发的程序呢,并不满足单一职责原则。下面我们来分析下之前的程序:

那其实我们上述案例的处理逻辑呢,从组成上看可以分为三个部分:

  • 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作。

  • 逻辑处理:负责业务逻辑处理的代码。

  • 请求处理、响应数据:负责,接收页面的请求,给页面响应数据。

按照上述的三个组成部分,在我们项目开发中呢,可以将代码分为三层:

  • Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。

  • Service:业务逻辑层。处理具体的业务逻辑。

  • Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。

基于三层架构的程序执行流程:

  • 前端发起的请求,由Controller层接收(Controller响应数据给前端)

  • Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)

  • Serivce层调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取)

  • Dao层操作文件中的数据(Dao拿到的数据会返回给Service层)

思考:按照三层架构的思想,如何要对业务逻辑(Service层)进行变更,会影响到Controller层和Dao层吗?

答案:不会影响。 (程序的扩展性、维护性变得更好了)

3.1.2 代码拆分

我们使用三层架构思想,来改造下之前的程序:

  • 控制层包名:xxxx.controller

  • 业务逻辑层包名:xxxx.service

  • 数据访问层包名:xxxx.dao

控制层:接收前端发送的请求,对请求进行处理,并响应数据

@RestController
public class EmpController {
 ? ?//业务层对象
 ? ?private EmpService empService = new EmpServiceA();
?
 ? ?@RequestMapping("/listEmp")
 ? ?public Result list(){
 ? ? ? ?//1. 调用service层, 获取数据
 ? ? ? ?List<Emp> empList = empService.listEmp();
?
 ? ? ? ?//3. 响应数据
 ? ? ? ?return Result.success(empList);
 ?  }
}

业务逻辑层:处理具体的业务逻辑

  • 业务接口

//业务逻辑接口(制定业务标准)
public interface EmpService {
 ? ?//获取员工列表
 ? ?public List<Emp> listEmp();
}
  • 业务实现类

//业务逻辑实现类(按照业务标准实现)
public class EmpServiceA implements EmpService {
 ? ?//dao层对象
 ? ?private EmpDao empDao = new EmpDaoA();
?
 ? ?@Override
 ? ?public List<Emp> listEmp() {
 ? ? ? ?//1. 调用dao, 获取数据
 ? ? ? ?List<Emp> empList = empDao.listEmp();
?
 ? ? ? ?//2. 对数据进行转换处理 - gender, job
 ? ? ? ?empList.stream().forEach(emp -> {
 ? ? ? ? ? ?//处理 gender 1: 男, 2: 女
 ? ? ? ? ? ?String gender = emp.getGender();
 ? ? ? ? ? ?if("1".equals(gender)){
 ? ? ? ? ? ? ? ?emp.setGender("男");
 ? ? ? ? ?  }else if("2".equals(gender)){
 ? ? ? ? ? ? ? ?emp.setGender("女");
 ? ? ? ? ?  }
?
 ? ? ? ? ? ?//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导
 ? ? ? ? ? ?String job = emp.getJob();
 ? ? ? ? ? ?if("1".equals(job)){
 ? ? ? ? ? ? ? ?emp.setJob("讲师");
 ? ? ? ? ?  }else if("2".equals(job)){
 ? ? ? ? ? ? ? ?emp.setJob("班主任");
 ? ? ? ? ?  }else if("3".equals(job)){
 ? ? ? ? ? ? ? ?emp.setJob("就业指导");
 ? ? ? ? ?  }
 ? ? ?  });
 ? ? ? ?return empList;
 ?  }
}

数据访问层:负责数据的访问操作,包含数据的增、删、改、查

  • 数据访问接口

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

    //数据访问实现类
    public class EmpDaoA implements EmpDao {
     ? ?@Override
     ? ?public List<Emp> listEmp() {
     ? ? ? ?//1. 加载并解析emp.xml
     ? ? ? ?String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
     ? ? ? ?System.out.println(file);
     ? ? ? ?List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
     ? ? ? ?return empList;
     ?  }
    }

 

三层架构的好处:

  1. 复用性强

  2. 便于维护

  3. 利用扩展

文章来源:https://blog.csdn.net/qq_69748833/article/details/135071796
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。