kim.zhang

风在前,无惧!


  • 首页

  • 标签42

  • 分类12

  • 归档94

  • 搜索

自动配置.md

发表于 2020-08-10 更新于 2021-11-21 分类于 SpringBoot
本文字数: 2k 阅读时长 ≈ 2 分钟

我们运行启动类就可以运行项目,那么SpringBoot是怎么自动配置的呢?

我们从SpringBoot的入口类开始分析。入口类有@SpringBootApplication注解。点击进去:

@SpringBootConfiguration实际上也是一个@Configuration

1
2
3
4
5
6
7
8
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

SpringBoot自动配置的核心注解是@EnableAutoConfiguration,它主要是用来加载第三方库的类,点击进去:

1
2
3
4
5
6
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)

@AutoConfigurationPackage:

1
2
3
4
5
6
7
8
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {

}

可以看到上面的注解导入了一个类,这个类调用了getPackageName()方法。通过debug调试可以知道,这个packageName是SprinGBoot启动类同级目录的包名。换句话说,SpringBoot会自动扫描与启动类同级包以及子包的所有类。

1
2
3
4
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}

接下来看@EnableAutoConfiguration还导入了另外一个类:@Import(AutoConfigurationImportSelector.class)

selectImports方法返回一个String数组,该数组包含了配置类的全限定名。通过获取配置类的全限定名,来将类导入IOC容器,从而实现自动配置。

1
2
3
4
5
6
7
8
9
10
11
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

那么,这些配置类的全限定名是从哪里来的呢?可以看到加载了一个配置文件:

1
2
3
4
final class AutoConfigurationMetadataLoader {

protected static final String PATH = "META-INF/spring-autoconfigure-metadata.properties";
}

配置文件的内容:可以看到配置文件中是各种jar包的配置类

image-20200620201852666

一毛也是爱~
Kim.Zhang 微信支付

微信支付

# 配置
自定义异常体系.md
加载第三方组件.md
Kim.Zhang

Kim.Zhang

且行且珍惜
94 日志
12 分类
42 标签
E-Mail Weibo
粵ICP备19091267号 © 2019 – 2022 Kim.Zhang | 629k | 9:32
本站总访问量 4 次 | 有 309 人看我的博客啦 |
博客全站共176.7k字
载入天数...载入时分秒...
0%