SpringBoot 自动配置

云惠网小编 2021年7月30日01:17:39
评论
2681字阅读8分56秒
摘要

SpringBoot [email protected] [email protected] [email protected] // [email protected] @EnableAutoConfiguration //指定扫描哪些,Spring注解;@ComponentScan(excludeFilters = { @ComponentScan.Filter(typ

广告也精彩

[email protected]
[email protected]


[email protected]  等同于下面3个注解
@SpringBootConfiguration  // [email protected]  
@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);
}
}

List configurations 获取到的候选的配置类一共有125个

在这里插入图片描述

SpringBoot 自动配置

在这里插入图片描述

SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
生效的配置类就会给容器中装配很多组件
只要容器中有这些组件,相当于这些功能就有了
定制化配置
[email protected]
[email protected]改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

@SpringBootApplication解释引导加载自动配置类

@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
[email protected]@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));
}
}

[email protected] @EnableAutoConfiguration @ComponentScan

[email protected]
包含如下两个注解

总结

1.@SpringBootApplication

b.@Import({AutoConfigurationImportSelector.class})

@AutoConfigurationPackage
@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),最终会按需配置

new AutoConfigurationPackages.PackageImport(metadata)拿到的就是包名
就可以导入包名下一系列标注的的组件 也就是通过这个方法 约定主函数要和
其他包处于同级目录下才能扫描到组件

[email protected]
指定扫描哪些,Spring注解

a. @AutoConfigurationPackage``

本文转自 https://blog.csdn.net/weixin_45913918/article/details/119169585

腾讯云618
云惠网小编
Java—代码块详解 java

Java—代码块详解

代码块概念代码块分类普通代码块构造代码块静态代码块同步代码块代码块概念在java中,{ } 括起来的代码被称为代码块代码块分类普通代码块类中方法的方法体public class M...
腾讯云618

发表评论