¿Cómo Springboot realiza la configuración automática a través de anotaciones?

SpringBootApplicationEl código fuente es el siguiente:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
    
     @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    
    }

La nota relacionada con la configuración automática es @EnableAutoConfigurationque el código fuente es el siguiente:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    
    }

En primer lugar @AutoConfigurationPackage, el código fuente de la anotación es el siguiente:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
    
    

}

Al @Import(AutoConfigurationPackages.Registrar.class)introducir la ruta del paquete donde se encuentra la clase de inicio, los marcos posteriores la utilizan principalmente, como JPA, etc. La depuración es la siguiente:

org.springframework.boot.autoconfigure.AutoConfigurationPackages#register
public static void register(BeanDefinitionRegistry registry, String... packageNames) {
    
    
	if (registry.containsBeanDefinition(BEAN)) {
    
    
		BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN);
		ConstructorArgumentValues constructorArguments = beanDefinition.getConstructorArgumentValues();
		constructorArguments.addIndexedArgumentValue(0, addBasePackages(constructorArguments, packageNames));
	}
	else {
    
    
		GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
		beanDefinition.setBeanClass(BasePackages.class);
		beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, packageNames);
		beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		registry.registerBeanDefinition(BEAN, beanDefinition);
	}
}

Inserte la descripción de la imagen aquí
La anotación @Import(AutoConfigurationImportSelector.class)es para introducir la configuración automática requerida. La depuración es la siguiente:

org.springframework.context.annotation.ConfigurationClassParser.DeferredImportSelectorGrouping#getImports
public Iterable<Group.Entry> getImports() {
    
    
	for (DeferredImportSelectorHolder deferredImport : this.deferredImports) {
    
    
		this.group.process(deferredImport.getConfigurationClass().getMetadata(),
				deferredImport.getImportSelector());
	}
	return this.group.selectImports();
}

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/wang0907/article/details/113463404
Recomendado
Clasificación