springboot的SPI机制

本文介绍Spring Boot中SPI机制的应用,特别是如何通过@EnableAutoConfiguration实现自动配置,并自定义starter来扩展Spring Boot的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SPI,即Service Provider Interface,为某个接口寻找服务实现的机制。

在springboot的启动类上面,我们一般会标注启动类注解@SpringBootApplication,而@SpringBootApplication是@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan等多个注解的合体,SPI机制的入口注解是@EnableAutoConfiguration,即springboot标注该注解,表示可以实现自动配置.

@EnableAutoConfiguration注解如下

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

我们可以看到,该注解import了一个EnableAutoConfigurationImportSelector类

该类有一个方法

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

该方法会通过SpringFactoriesLoader遍历整个ClassPath中所有jar包下的spring.factories文件

所以我们自己开发的组件,如果想无缝融合到springboot中,就可以构建一个starter包,在该包中META-INF/spring.factories写入我们的组件的启动类的名称,springboot就可以通过SPI机制在启动的时候,自动加载并启动我们的组件。

SpringFactoriesLoader 源码解析可参考

https://andyboke.blog.csdn.net/article/details/84025989?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control

SpringBoot的自动装配原理、自定义starter与spi机制,一网打尽_阳阳的技术博客_51CTO博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值