SpringBoot 自动配置
Posted tt句号
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 自动配置相关的知识,希望对你有一定的参考价值。
SpringBoot 自动配置
@SpringBootApplication解释引导加载自动配置类
//@SpringBootApplication 等同于下面3个注解
@SpringBootConfiguration // 就是一个@Configuration注解。代表当前是一个配置类
@EnableAutoConfiguration
//指定扫描哪些,Spring注解;
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public class Application
{
public static void main( String[] args )
{
SpringApplication.run(Application.class, args);
}
}
1.@SpringBootApplication
等同于3个注解@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
1.1@SpringBootConfiguration
就是一个@Configuration注解。代表当前是一个配置类
1.2@ComponentScan
指定扫描哪些,Spring注解
1.3@EnableAutoConfiguration
包含如下两个注解
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
a. @AutoConfigurationPackage``
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
//@AutoConfigurationPackage用@Import引入Registrar.class 利用Registrar类的两个方法
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));
}
}
new AutoConfigurationPackages.PackageImport(metadata)拿到的就是包名
就可以导入包名下一系列标注的的组件 也就是通过这个方法 约定主函数要和
其他包处于同级目录下才能扫描到组件
b.@Import({AutoConfigurationImportSelector.class})
使用getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata)批量的导入一些组件
再用List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes)
获取到所有需要导入到容器中的配置类
调用 List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader())
利用loadFactoryNames工厂加载Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader)
得到所有的组件
从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories
然后再按需开启自动配置项
xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置
List configurations 获取到的候选的配置类一共有125个
总结
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
生效的配置类就会给容器中装配很多组件
只要容器中有这些组件,相当于这些功能就有了
定制化配置
用户直接自己@Bean替换底层的组件
用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties
以上是关于SpringBoot 自动配置的主要内容,如果未能解决你的问题,请参考以下文章
[AndroidStudio]_[初级]_[配置自动完成的代码片段]