前言
- 最近因为业务需要,被拉去研究后端的项目,代码框架基于 Spring Boot,后端对我来说完全小白,需要重新学习研究…
- 出于个人习惯,会以 Blog 文章的方式做一些记录,文章内容基本来源于「 Spring Boot 从入门到精通(明日科技) 」一书,做了一些整理,更易于个人理解和回顾查找,所以大家如果希望更系统性的学习,可以阅读此书。
系列 | 文章 |
---|---|
Spring Boot 学习之路 | 📑 基础认知 |
Spring Boot 学习之路 | 📑 项目配置 |
Spring Boot 学习之路 | 📑 处理 HTTP 请求 |
Spring Boot 学习之路 | 📑 Service 层 |
Spring Boot 学习之路 | 📑 Thymeleaf 模板引擎 |
一、Service 层与 @Service 注解
在实际开发中,Service 层主要负责业务模块的逻辑应用设计。在设计 Service 层的过程中,首先设计接口,然后设计接口的实现类。通常情况下,Service 层用于封装项目中一些通用的业务逻辑,这么做的好处是有利于业务逻辑的独立性和重复利用性。因此,为了处理一个 Spring Boot 项目中的业务逻辑,Service 层是不可或缺的。
Spring Boot 中的 Service 层是业务逻辑层,其作用是处理业务需求,封装业务方法,执行 Dao 层中用于访问、处理数据的操作。Service 层通常由一个接口和这个接口的实现类组成。其中,Service 层的接口可以在 Controller 层中被调用,用于实现数据的传递和处理;Service 层的实现类须使用 @Service 注解予以标注。
说明:
Dao 层介于 Service 层和数据库之间,用于访问、操作数据库中的数据。Dao 层通常由 Dao 接口、Dao 实现类和 Dao 工厂类这 3 个部分组成。在 Dao 接口中,定义了一系列用于访问、操作数据库中数据的方法。在 Dao 实现类中,实现了 Dao 接口中的方法。Dao 工厂类的作用是返回一个 Dao 实现类的对象。
Controller 层的作用是通过调用 Service 层的接口,控制各个业务模块的业务流程。Controller 层通过解析用户通过 URL 地址发送的请求,调用不同的 Service 层的接口以处理这个请求,把处理结果返回给客户端。
在 Spring Boot 中,把被 @Service 注解标注的类称作「服务类」。@Service 注解属于 Component 组件,可以被 Spring Boot 的组件扫描器扫描到。当启动 Spring Boot 项目时,服务类的对象会被自动地创建,并被注册成 Bean。
二、Service 层的实现过程
大多数的 Spring Boot 项目采用接口模式实现 Service 层。那么,在实际开发中,如何实现 Service 层呢?如下图所示,Service 层的实现过程如下。
- 定义一个 Service 层的接口,在这个接口中定义用于传递和处理数据的方法。例如,定义一个 Service 层的接口 ProductService,代码如下:
public interface ProductService {
... // 省略用于传递和处理数据的方法
}
- 定义一个 Service 层的接口的实现类,使用 @Service 注解予以标注。这个实现类的作用有两个:一个是实现 Service 层的接口中的业务方法;另一个是执行 Dao 层中用于访问、处理数据的操作。
例如,使用 @Service 注解标注实现 ProductService 接口的 ProductServiceImpl 类,代码如下:
public class ProductServiceImpl implements ProductService {
... // 省略用于实现接口的业务方法和用于执行访问、处理数据的操作的代码
}
- 在服务类的对象被自动地创建并被注册成 Bean 之后,其他 Component 组件即可直接注入这个 Bean。
三、同时存在多个实现类的情况
在上一节中,通过简单的示例只演示了一个 Service 层的接口存在一个实现类的情况。但是在实际开发中,一个 Service 层的接口可能会针对多种业务场景而存在多个实现类。
本节将介绍如何处理 Spring Boot 中的 “一个 Service 层的接口同时存在多个实现类” 的情况。
3.1 按照实现类的名称映射服务类的对象
使用 @Service 注解标注一个 Service 层的接口的实现类,这个实现类被称作服务类,这个实现类的对象被称作服务类的对象。服务类的对象会被自动地创建,并被注册成 Bean。
综上所述,Bean 的名称就是实现类的名称。需要注意的是,实现类的名称的首字母要大写,Bean 的名称的首字母是小写的。
例如,使用 @Service 注解标注实现 Service 接口的 ServiceImpl 类,代码如下:
@Service
public class ServiceImpl implements Service {
}
在上述代码中,实现类的名称是 ServiceImpl。因为 Bean 的名称就是实现类的名称,所以 Bean 的名称是 serviceImpl。因此,上述代码就等同于如下的用于注册 Bean 的代码:
@Bean("serviceImpl")
public Service createBean() {

return new ServiceImpl();
}
这样,其他