文章目录
底层注解-@ConfigurationProperties配置绑定
@ConfigurationProperties(prefix = “manager”)
@EnableConfigurationProperties(Manager.class)
springboot自动配置的原理
@SpringBootApplication
@SpringBootConfiguration
@ComponentScan
包扫描
@EnableAutoConfiguration
@AutoConfigurationPackage 自动配置包
利用registrar给容器中导入一系列的组件
打个断点,debug启动
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
自动配置包的总结
以上步骤的原理:就是通过注解 获取 主方法类的 所在的包名。
将包名放到一个字符串数组中,进行注册。
所以,@AutoConfigurationPackage 注解,批量注册该包下的所有组件。
我认为是自定义的组件。
@AutoConfigurationPackage注解,通过一系列的注解套娃,获得了 主配置类所在的包,对该包下的所有(自定义的组件进行注册)。
也就说明了,没有在 主配置类 所在的包及其子包中,是无法注册到容器中的。
@Import({AutoConfigurationImportSelector.class}) 注解
通过了这个方法,130个配置类的全类名的字符串给获取到了。
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
这个方法,是按照什么规则,来进行获取到的。
进入方法里面进行查看:
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
点击去
点进去
类加载器默认加载当前系统里面所有 META-INF/spring.factories 位置的文件
特别是这个 spring-boot-autoconfugure 这个包 是 核心配置包
我发现:
就 spring-boot-autoconfugure这个jar包中有这个META-INF/spring.factories 文件。而其他的与springboot配置无关的jar包里面没有。
因为 我导入了:
所以,之前的导入的集合中就有130个。
问题:
为什么读取的是
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
下的文件内容?
在配置文件写死了,已启动springboot就加载的配置类。(还需要进行按需加载)
虽然进行了加载这些配置类,但是会通过@Condition的一系列的注解进行筛选。
总结
AutoConfigurationImportSelector.class 是通过 类加载器加载 所有jar包所在的META-INF/spring.factories 的文件,一般跟springboot配置相关的jar包才有这个文件。
然后读取,通过@Condition的一系列的注解 进行过滤后,再进行加载进入内存。
成功读取到的 ***autoConfigura的类,这个类中有一系列的组件。
类和其中的组件都是由@Condition的一系列的注解 进行按需加载的。
静态资源配置原理
静态资源是属于web场景的。一加载springboot, 就会自动配置xxxAutoConfigation文件。
所以,在springboot 自动配置包中进行查看即可。
SprigMvc的配置类: 大多在WebMvcAutoConfiguration 这个类中。
查看这个配置类是否生效:
生效
找到这个内部类:
点进入查看
说明了,所有的参数都是从容器中进行拿取。
资源处理的默认规则: