首页 > 其他分享 >【SpringBootWeb入门-8】分层解耦-三层架构

【SpringBootWeb入门-8】分层解耦-三层架构

时间:2023-12-09 23:02:12浏览次数:37  
标签:入门 List SpringBootWeb hiker 分层 emp import com public

1、架构前言

在讲解三层架构之前,我们先来看一段Controller代码段,代码如下:

package com.hiker.controller;

import com.hiker.pojo.Emp;
import com.hiker.pojo.Result;
import com.hiker.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
public class EmpController {
    @RequestMapping("/listEmp")
    public Result list(){
        //1. 加载并解析emp.xml
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);

        //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("就业指导");
            }
        });

        //3. 响应数据
        return Result.success(empList);
    }
}
View Code

这段Controller代码段作用是加载并解析xml文件里面的数据,然后对数据进行转换处理,最后返回了一个统一响应结果。

这段代码能够完成了一个功能实现,但是回过头看,所有的功能实现代码都写在了一个Controller代码里面,且里面存在了数据操作、逻辑处理,这样的代码复用性差,如果所有的代码都这么写,那么整个项目将会难以维护。

那么上述问题要怎么解决它呢?我们可以通过分层解耦的方式来解决,本篇分层解耦先讲解web开发的三层架构。

在接触三层架构之前,我们先看回上面的代码段,这段代码大致可以分为三个模块:

我们在进行软件开发的时候,尽量让每一个接口、类或者方法它的职责更加单一,也就是一个类/方法,它就只做一件事情,只负责一块功能,就是所谓的单一职责原则,这样就会使得我们的接口、类、方法复杂度更低,可读性更好,也易于维护。基于此,才有web开发的三层架构。

2、架构解析

  • controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
  • service:业务逻辑层,处理具体的业务逻辑。
  • dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。

前端发起的一个请求,先到达Controller层,Controller接收到请求后,要去调用Service业务逻辑层,逻辑处理的前提是要拿到数据进行处理,所以Service层要去调用dao数据层,dao层再去操作文件数据,数据拿到后再返回Service,Service层拿到数据后再进行逻辑处理,处理完成后再将结果返回Controller层,Controller再响应数据返回给前端页面。这样分层的好处是:如果需要修改业务处理的逻辑,我们就不需要修改其他层的代码,增加代码的可维护性扩展性。

3、架构改造

下面我们来对上面的Controller代码按照三层架构进行改造。

 dao层:创建接口EmpDao以及其实现类

接口EmpDao:

1 package com.hiker.dao;
2 import com.hiker.pojo.Emp;
3 import java.util.List;
4 public interface EmpDao {
5     //获取员工列表数据
6     public List<Emp> listEmp();
7 }
View Code

 实现类EmpDaoA:

package com.hiker.dao.impl;

import com.hiker.dao.EmpDao;
import com.hiker.pojo.Emp;
import com.hiker.utils.XmlParserUtils;
import java.util.List;

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;
    }
}
View Code

service层:创建接口EmpService以及其实现类

接口EmpService:

package com.hiker.service;

import com.hiker.pojo.Emp;

import java.util.List;

public interface EmpService {
    //获取员工列表
    public List<Emp> listEmp();
}
View Code

实现类EmpServiceA:

package com.hiker.service.impl;

import com.hiker.dao.EmpDao;
import com.hiker.dao.impl.EmpDaoA;
import com.hiker.pojo.Emp;
import com.hiker.service.EmpService;
import java.util.List;

public class EmpServiceA implements EmpService {

    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;
    }
}
View Code

Controller层请求处理改造:

package com.hiker.controller;

import com.hiker.dao.EmpDao;
import com.hiker.pojo.Emp;
import com.hiker.pojo.Result;
import com.hiker.service.EmpService;
import com.hiker.service.impl.EmpServiceA;
import com.hiker.utils.XmlParserUtils;
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 EmpServiceA();

    @RequestMapping("/listEmp")
    public Result list(){
        //1. 调用service, 获取数据
        List<Emp> empList = empService.listEmp();

        //3. 响应数据
        return Result.success(empList);
    }

}
View Code

 

至此,原先代码改造成三层架构的已完成,最后拆分前后的对比图如下:

 下一篇我们讲解三层架构的劣势以及分层解耦。

标签:入门,List,SpringBootWeb,hiker,分层,emp,import,com,public
From: https://www.cnblogs.com/hiker0412/p/17889182.html

相关文章

  • 测试入门
     测试入门(01):一篇文章带你彻底理解测试基础测试入门(02):软件测试模型测试入门(03):测试流程测试入门(04):测试计划、方案测试入门(05):测试用例要素及其设计方法测试入门(06):bug要素及其生命周期测试入门(07):测试报告......
  • Volatility2.6内存取证工具安装及入门Linux和Windows下安装
    (Volatility2.6内存取证工具安装及入门Linux和Windows下安装)1-1.Volatility2.6简介Volatility是一个完全开源的工具,用于从内存(RAM)样本中提取数字工件。支持Windows,Linux,MaC,Android等多类型操作系统系统的内存取证。那么针对竞赛这块(CTF、技能大赛等)基本上都是用在Misc方......
  • Docker入门教程
    什么是DockerDocker是开源的应用容器引擎。Docker可以让你将所有应用软件以及它的以来打包成软件开发的标准化单元。Docker容器将软件以及它运行安装所需的一切文件(代码、运行时、系统工具、系统库)打包到一起,这就保证了不管是在什么样的运行环境,总是能以相同的方式运行。就好像......
  • [学习笔记]分层图最短路
    分层图的概念分层图最短路,听名字就知道他和其他最短路不一样,实际也确实如此,可以解决一些普通最短路无法解决的问题。比如有\(n\)个点\(m\)条带权无向边,可以将\(k\)条边进行某些操作,然后求出从\(1\)到\(n\)的最短路,此时即可使用分层图。例题例题1P4568[JLOI2011]......
  • Docker 入门指南:轻松驾驭容器技术
    什么是Docker?Docker是一种容器技术,可以让你的应用程序在任何地方运行,无论是在你的开发机、测试环境还是生产服务器。这就像是一个神奇的魔法箱,把你的应用程序和它所需的一切打包在一起,确保它可以在任何地方一键运行。为什么使用Docker?跨平台性:Docker能够确保你的应用程序在不......
  • 【LGR-168-Div.4】洛谷入门赛 #18
    打表过样例题目描述很不幸,你遇到了不负责任的出题人。在某道试题里,共有\(N\)个测试点,组成了\(k\)个Subtask,第\(i\)个Subtask包含\(p_i\)个测试点,第\(j\)个测试点的编号为\(w_{i,j}\)。请注意,一个测试点可能属于多个Subtask。Subtask每个Subtask包含多个测......
  • Python从入门到实践practice4
    1input2类型转换3while4定义函数def'''input("这里放给用户的提示")input输入全为字符串str如果需要将str转换为int类型需要进行类型转换int(input(""))int只能转换数字,转换文字会报错类型转换还可以转为float(),str()整数不可以和字符串一起打印,需要类型转换后str(整数),才可以......
  • HydroOJ 从入门到入土(6)Caddy设置自动SSL证书, 开启高压缩比算法(brotli)节约网络带宽
    Caddy既出,何需Nginx?目录1.Caddy是啥2.Caddy配置简介3.使用gzip/br节省带宽3.1先把静态文件全部压缩3.2caddyfile中开启precompressed选项3.3查看是否成功1.Caddy是啥Caddy是用来替代Nginx的新一代反代工具,配置简单很多.有了Caddy,就不要再装N......
  • pandas光速入门
    读取csv和excelimportpandasaspd#没安装pandas的可以使用pipinstallpandas安装data=pd.read_csv('./data.csv')#读取csvlib=pd.read_excel('./library.xls')#读取excelprint(data)#输出csv数据如下:时间馆代码UID......
  • ctfshow-web入门-爆破wp
    Web21:​ 进入主页为登录框,随便输入信息用burp抓包,发现Authorization认证使用Base64加密传输,解密发现为刚才输入的信息右键发送至Intruder进行爆破,使用题目给出的字典进行爆破并添加变量添加前缀使用户名固定并用Base64加密传输,记得取消勾选url-encode,不然会转义Base64的"="......