SpringBoot的SPI机制源码解析

SpringBoot的SPI机制源码解析

什么是SPI?

SPI全称为Service Provider Interface(Service Provider Interface),是JDK内置的一种面向接口编程的机制。SPI的作用就是为这些接口寻找实现类。具体来说,当服务接口的实现类存在于classpath路径下的第三方jar包中,可以通过SPI机制自动发现并加载实现类,而无需在代码中显示的指定对象的创建。

SpringBoot中的SPI

SpringBoot中的SPI是基于JDK的SPI机制进行二次开发后的一种轻量级的SPI实现。在SpringBoot中,我们可以通过扩展SPI接口的方式轻松地实现插件扩展,在实现上还提供了比JDK SPI更灵活、易用和便捷的方式。

在SpringBoot中,插件的实现有两种方式:

  1. 实现指定的接口
  2. 使用@Service注解

SPI原理

1.在SPI机制中,服务接口部分称作Service,而具体实现服务的类称为Service Provider。
2.可以使用Java提供的SPI进行动态扩展,所以在使用SPI服务的过程中,需要编写一个服务接口,在服务提供者中编写该接口的实现类,并在服务配置文件中配置实现类的全路径地址。
3.在代码中可以使用ServiceLoader进行服务加载。

SpringBoot中的SPI注解扫描

SpringBoot在版本2.1后为我们提供了一个很方便的工具类用于自动侦测classpath下所有的SPI实现类,即SPI自动配置机制。

SpringBoot通过@EnableAutoConfiguration注解自动侦测classpath下所有的auto-configuration包以及META-INF/spring.factories文件。spring.factories文件内部存放当前应用需要启动的配置类列表。而配置类中可以使用@Conditional注解来控制当前应用装载此配置类。

SpringBoot处理SPI的过程

SpringBoot将SPI进行了二次封装,对Spring的ApplicationContext进行包装。其流程如下:

  1. SpringBoot创建BeanFactory实例,并注册相关的BeanDefinition
  2. SpringBoot创建ApplicationContext并使用BeanFactory作为其内部beanFactory
  3. SpringBoot启动ApplicationContext
  4. 扫描SPI注解
  5. 注册注解标注的SPI服务
  6. 启动初始化

两个示例

示例一:实现指定的接口

1.创建一个SPI接口:

public interface DemoService {
    String sayHello(String name);
}

2.编写DemoServiceImpl实现DemoService:

public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name + "!";
    }
}

3.在classpath下创建/META-INF/services/com.example.demo.DemoService,编写实现类的全路径名称:

com.example.demo.impl.DemoServiceImpl

4.在代码中使用ServiceLoader进行服务加载:

ServiceLoader<DemoService> serviceLoader = ServiceLoader.load(DemoService.class);
for (DemoService demoService : serviceLoader) {
    System.out.println(demoService.sayHello("world"));
}

输出结果为:Hello, world!

示例二:使用@Service注解

1.编写API接口:

public interface ApiService {
    String sayHello(String name);
}

2.编写实现类:

@Service
public class ApiServiceImpl implements ApiService{
    @Override
    public String sayHello(String name) {
        return "Hello, " + name + "!";
    }
}

3.在启动类中使用@ComponentScan注解,指定扫描com.example.demo包:

@SpringBootApplication
@ComponentScan("com.example.demo")
public class SpiApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpiApplication.class, args);
    }
}

4.使用@Autowired注解进行注入

@RestController
@RequestMapping("/api")
public class ApiController {
    @Autowired
    private ApiService apiService;
    @GetMapping("/hello/{name}")
    public String sayHello(@PathVariable String name){
        return apiService.sayHello(name);
    }
}

5.访问:http://localhost:8080/api/hello/world

输出结果为:Hello, world!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot的SPI机制源码解析 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 常见的垃圾收集器算法有哪些?

    常见的垃圾收集器算法有哪些? 在大部分编程语言中,动态内存分配是必不可少的。为了防止内存泄漏,需要进行垃圾回收(Garbage Collection,简称GC),即在进行垃圾回收时收集并释放不再需要使用的存储器资源,在内存使用过多而导致程序出现异常时,垃圾回收是很重要的。而垃圾回收主要有2类算法 — 标记-清扫(Mark and Sweep)和复制式(Cop…

    Java 2023年5月10日
    00
  • Java 从json提取数组并转换为list的操作方法

    下面是 “Java 从json提取数组并转化为list的操作方法” 的完整攻略: 1. 需要的依赖 在 Java 中使用 JSON 数据,我们需要导入相应的 JSON 解析库,这里我们以 JSON-java 为例。 在 Maven 项目中添加以下依赖即可: <dependency> <groupId>org.json</grou…

    Java 2023年5月26日
    00
  • Spring MVC 更灵活的控制 json 返回问题(自定义过滤字段)

    Spring MVC 是一款常用的 Web 框架,用于开发 Java Web 应用程序。它允许开发者对应用程序做出灵活的控制,其中一项迫切需要的控制就是对返回 JSON 数据的过滤。本文将探讨如何通过 Spring MVC 实现更灵活的对 JSON 返回数据进行过滤的控制。 环境搭建 在本地安装好 JDK 1.8 和 Maven 3.x 后,在 pom.xm…

    Java 2023年5月19日
    00
  • Java FastJson使用教程

    Java FastJson使用教程 什么是FastJson? FastJson是阿里巴巴的开源JSON处理库,它能够将Java对象转换成JSON格式的数据,也可以将JSON格式的数据转换成Java对象。FastJson处理速度极快,是目前Java平台上最快的JSON处理器之一。 FastJson的安装和配置 最简单的方法是通过Maven来引入FastJson…

    Java 2023年5月26日
    00
  • Java实现微信公众号获取临时二维码功能示例

    Java实现微信公众号获取临时二维码功能示例 在微信公众号开发中,获取临时二维码是一个常见的功能。本文将介绍如何使用Java实现微信公众号获取临时二维码功能的完整攻略。 1. 准备工作 在实现微信公众号获取临时二维码功能之前,需要进行以下准备工作: 注册微信公众号,并申请开发者权限,获取相关开发信息(如appID、appSecret等)。 使用Java开发环…

    Java 2023年5月26日
    00
  • CentOS安装solr 4.10.3详细教程

    CentOS安装solr 4.10.3详细教程 简介 Solr是一个开源的全文搜索引擎,使用Java编写,基于Apache Lucene构建。Solr可以用作独立的全文搜索服务器,也可以与其他应用程序集成。 本文将提供在CentOS上安装Solr 4.10.3的完整教程。 步骤 步骤1:安装Java 由于Solr是使用Java编写的,因此必须先安装Java。…

    Java 2023年6月2日
    00
  • JavaMail入门教程之解析邮件(5)

    JavaMail入门教程之解析邮件(5) 在这篇教程中,我们将学习如何使用JavaMail解析邮件内容。JavaMail提供了多种解析邮件内容的方法。我们将介绍以下三种方法: 使用getContentType()获取邮件的内容类型,并根据邮件的类型进行解析; 使用getContent()获取邮件的内容,并根据邮件类型进行解析; 使用MimeMessagePa…

    Java 2023年6月15日
    00
  • maven的pom文件与打包详解

    下面是“maven的pom文件与打包详解”的完整攻略。 什么是maven的pom文件 POM(Project Object Model)是Maven中项目的核心文件,它用于描述项目的元数据信息。POM文件是一个XML文件,它包含了用于构建项目的依赖关系、构建设置、插件配置等信息。默认情况下,Maven会在项目根目录找到pom.xml文件,并读取其中的配置信息…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部