Spring Boot 三层架构开发模式入门

在 Spring Boot 项目中,构建清晰、易于维护的代码结构至关重要。传统业务逻辑方式往往将所有代码混杂在一起,导致代码难以理解、修改和扩展。三层架构模式的出现正是为了解决这些问题,让我们深入了解它带来的改变。

一、传统业务逻辑方式

假设我们要实现一个简单的员工查询功能,传统方式可能会将所有代码写在 Controller 层:

java 复制代码
@RestController
@RequestMapping("/employees")
public class EmployeeController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/{id}")
    public Employee getEmployee(@PathVariable Long id) {
        String sql = "SELECT * FROM employees WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(Employee.class));
    }
}

这段代码看似简洁,却隐藏着以下问题:

  • 代码耦合度高: Controller 层直接依赖 JdbcTemplate,与数据访问细节紧密绑定。

  • 职责不清晰: Controller 层既负责处理请求,又负责数据访问逻辑,违反了单一职责原则。

  • 代码难以复用: 如果其他模块需要查询员工信息,只能复制这段代码,造成冗余。

  • 难以维护和扩展: 当数据库操作发生变化时,所有涉及到该操作的代码都需要修改,增加了维护成本。

二、三层架构模式:分层解耦,各司其职

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

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

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

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

2.为了解决传统方式的弊端,我们引入三层架构模式,将代码划分为以下三层:

  • 表现层(Controller): 负责接收前端请求,调用 Service 层处理业务逻辑,并将处理结果返回给前端。

  • 业务逻辑层(Service): 负责处理具体的业务逻辑,例如:参数校验、业务规则判断、调用其他服务等,并调用 Repository 层进行数据操作。

  • 数据访问层(Dao): 负责与数据库交互,进行数据的增删改查操作,屏蔽底层数据库操作细节。

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

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

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

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

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

可以简单的理解为: 要去一个盒子套盒子 的盒子里面取东西,得先依次由外到内 打开所有盒子,拿到东西,再由内到外把盒子还原为初始状态。

三、解耦后的代码示例:清晰、易维护的结构

让我们用三层架构模式重构之前的员工查询功能:

开发顺序有两种,根据实际情况选择

方式一:Controller -> Service -> Dao

方式二:Dao -> Service -> Controller

1. 数据访问层 (Dao):

java 复制代码
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    //与数据库交互
}

EmployeeRepository 负责直接与数据库交互,当然,复杂的SQL语句也可以通过mybatis映射文件进行操作,都是一个道理。

2. 业务逻辑层 (Service):

java 复制代码
@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    public Employee getEmployeeById(Long id) {
        // 可以在这里添加业务逻辑,例如权限校验等
        return employeeRepository.findById(id).orElseThrow(() -> new RuntimeException("Employee not found"));
    }
}

EmployeeService 负责处理具体的业务逻辑,例如根据 ID 查询员工信息,并处理可能出现的异常。

3. 表现层 (Controller):

java 复制代码
@RestController
@RequestMapping("/employees")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @GetMapping("/{id}")
    public Employee getEmployee(@PathVariable Long id) {
        return employeeService.getEmployeeById(id);
    }
}

EmployeeController 只负责接收请求参数,调用 EmployeeService 处理业务逻辑,并返回结果。

四、三层架构模式带来的优势

通过上面的代码示例,我们可以看到三层架构模式带来的好处:

  • 降低耦合度: 各层之间通过接口交互,降低了层与层之间的依赖,提高了代码的灵活性。

  • 提高代码复用性: 将业务逻辑封装在 Service 层,可以方便地在不同的 Controller 或其他模块中复用。

  • 提高代码可读性和可维护性: 将代码逻辑分层,使得代码结构更加清晰,易于理解和维护。

  • 易于扩展: 当需求发生变化时,只需要修改相应的层即可,其他层不受影响。

五、总结

三层架构模式是 Spring Boot 项目开发中常用的架构模式,它可以有效地提高代码的质量和可维护性。通过将代码逻辑分层,我们可以降低代码的耦合度,提高代码的可读性和可复用性,从而使我们的项目更加健壮和易于扩展。

以上就是关于三层架构的有关知识,感谢各位看官的观看,下期见,谢谢~

相关推荐
雷神乐乐13 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|18 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
逊嘘37 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
morris13144 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
W Y1 小时前
【架构-37】Spark和Flink
架构·flink·spark
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word