前言:
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 注解了,去掉就行,如下:
说明:
【1】使用了 spring.factories 实现自动注册,就没必要再使用 @Component或@Configuration 了
【2】@Component、@Configuration、自动注册,这三者的加载优先级为:@Component > 自动注册 > @Configuration
3、我们可以使用 @AutoConfigureOrder(0) 来控制配置类的加载先后顺序,从而可以使用 @ConditionalOnMissingBean、@ConditionalOnBean 等这类条件注解来控制实例注册的前置条件
@AutoConfigureOrder(1)
public class DtoTestFour {
/**
* <p>验证自动配置类加载顺序,@Bean作用的实例条件限制等</p>
* <p>在最后加载的配置类中,才可以使用先加载的配置类中的@Bean标注的实例</p>
*
* @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自动注册大致流程: