如果有一个第三方库希望在 Spring Boot 应用启动时自动配置一些功能,它可以在自己的 JAR 包中提供一个 spring.factories
文件,并在其中指定相关的自动配置类。当应用引入了这个第三方库的依赖后,Spring Boot 就能根据 spring.factories
中的配置来自动应用相应的配置。
简单搜索一下spring.factories
打开看看
装配的大致过程是下面这样的
- 本项目写一个配置类,引入第三方的装配类
less
@Configuration // 本项目的配置类
@Import(MyImportSelector.class)
static class Config {
@Bean
public Bean1 bean1() {
return new Bean1("本项目");
}
}
- 第三方的装配类通过实现
ImportSelector
接口,重写selectImports()
方法,在该方法中指定在spring.factories
的键值,等到SpringBoot执行注解解析时,bean就会被自动引入。
typescript
static class MyImportSelector implements DeferredImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
List<String> names = SpringFactoriesLoader.loadFactoryNames(MyImportSelector.class, null);
return names.toArray(new String[0]);
}
}
举例
以引入Mybatis相关bean的自动配置类MybatisAutoConfiguration
为例,
MybatisAutoConfiguration
被注解@Configuration
注解,所以会在启动时被SpringBoot扫描,扫描以后,根据相关条件注释,来决定是否自动装配bean。
那么之前提到的import注解在哪里呢?其实在EnableConfigurationProperties
点进去看看。
可以得出一个不靠谱的结论,使用Enable
打头的注解,大部分都包含使用import来导入bean这一步。