欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-03 16:35:01
在用SpringBoot开发Spring应用的时候,引导类上我们一般会加上 @SpringBootApplication这个注解;这个注解是一个组合注解@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = Filte....

在用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自动装配之spring-autoconfigure-metadata.properties

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

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 阶段调用,调用栈如下图

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

我们直接来到核心方法

	@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

相关标签: Spring boot