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