Springboot自动装配之spring-autoconfigure-metadata.properties
在用SpringBoot开发Spring应用的时候,引导类上我们一般会加上 @SpringBootApplication这个注解;这个注解是一个组合注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication
是这三个注解的组合注解,这里我们主要研究一下自动装配核心标签@EnableAutoConfiguration里一部分逻辑;
自动装配,我的理解是Springboot根据我们引用的jar包或者配置,自动将对应的组件加进我们的应用中;比如我们在pom里依赖了spring-boot-starter-web,那么Springboot就会将嵌入式Tomcat作为web容器;
Springboot提供了多种组件的自动装配,具体可以看以下截图
Springboot提供了这么多的选项,那么加载的入口在哪里呢?我们看看 @EnableAutoConfiguration 这个标签定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class<?>[] exclude() default {};
/**
* Exclude specific auto-configuration class names such that they will never be
* applied.
* @return the class names to exclude
* @since 1.3.0
*/
String[] excludeName() default {};
}
可以看出这个注解是 @Import 标签的复合注解,引入的配置类是
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector 这个类就是自动装配的入口了;熟悉Spring的应该知道,被Import的配置类org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports方法会在Spring容器生命周期的 invokeBeanFactoryPostProcessors 阶段调用,调用栈如下图
我们直接来到核心方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
//@1
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
//@2
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
@1:从配置文件 spring-autoconfigure-metadata.properties 获得自动装配类过滤相关的配置
@2:根据Spring 类似SPI的SpringFactory功能,获得所有自动装配的配置
spring-autoconfigure-metadata.properties
我们看看第一个核心代码
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
这行代码主要逻辑是获得自动装配相关的元数据信息,
spring.factories
...
本文地址:https://blog.csdn.net/Aqu415/article/details/107676073