Springboot自动装配之spring-autoconfigure-metadata.properties

2022-07-31,,,,

在用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

《Springboot自动装配之spring-autoconfigure-metadata.properties.doc》

下载本文的Word格式文档,以方便收藏与打印。