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 自动配置的主要内容,如果未能解决你的问题,请参考以下文章

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

[AndroidStudio]_[初级]_[配置自动完成的代码片段]

[AndroidStudio]_[初级]_[配置自动完成的代码片段]

[AndroidStudio]_[初级]_[配置自动完成的代码片段]