SpringBoot利用Spring SPI机制实现自动按顺序加载注册JavaBean到容器中

前言:
1、SPI机制(Service Provider Interface),服务提供接口,主要是用来解耦,资源文件目录下的 \resources\META-INF\spring.factories 我们把它归纳为Spring为我们提供的SPI机制,通过这种机制,我们可以在不修改Spring源码的前提下,非常轻松地做到对Spring框架的扩展开发

一、spring.factories 文件中存放需要自动注册的类全路径名

1、spring.factories 文件中我们自定义的类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hkl.mpjoin.modules.dto.DtoTestTwo,\
com.hkl.mpjoin.modules.dto.DtoTestFour

2、由于我们把注册JavaBean到Spring容器的任务交给SpringBoot了,所以不需要在类标注 @Component或@Configuration 注解了,去掉就行,如下:
SpringBoot利用Spring SPI机制实现自动按顺序加载注册JavaBean到容器中_第1张图片

说明:
【1】使用了 spring.factories 实现自动注册,就没必要再使用 @Component或@Configuration 了
【2】@Component、@Configuration、自动注册,这三者的加载优先级为:@Component > 自动注册 > @Configuration

3、我们可以使用 @AutoConfigureOrder(0) 来控制配置类的加载先后顺序,从而可以使用 @ConditionalOnMissingBean、@ConditionalOnBean 等这类条件注解来控制实例注册的前置条件

@AutoConfigureOrder(1)
public class DtoTestFour {

    /**
     * 

验证自动配置类加载顺序,@Bean作用的实例条件限制等

*

在最后加载的配置类中,才可以使用先加载的配置类中的@Bean标注的实例

* * @author hkl * @date 2022/11/28 */ @Bean(name = "dtoTestOne2") @ConditionalOnMissingBean(name = "dtoTestOne2") public DtoTestOne dtoTestOneTemp() { DtoTestOne dtoTestOne = new DtoTestOne(); dtoTestOne.testStra = "刘七"; System.out.println("dtoTestOneTemp跑了"); return dtoTestOne; } }

说明:
【1】@AutoConfigureOrder(0) 的值默认为0,值比0越大加载的优先级越低,也就是说值越大加载顺序越靠后

二、SpringBoot自动注册大致流程:
SpringBoot利用Spring SPI机制实现自动按顺序加载注册JavaBean到容器中_第2张图片

 

你可能感兴趣的:(SpringBoot,spring,spring,boot)