Notas de lectura de Spring Cloud Alibaba_2: Ensamblaje automático de Spring Boot

Montaje automático Spring Boot

En pocas palabras, es el proceso de ensamblar el Bean en el contenedor de IoC.

Realización de montaje automático

  • El ensamblaje automático en Spring Boot se habilita a través de la anotación @EnableAutoConfiguration , que se declara en la anotación de clase de inicio @SpringBootApplication .
@SpringBootApplication
public class Application {
    
    
	public static void main(String[] args) {
    
    
		SpringApplication.run(Application.class, args);
	}	
}
@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 {
    
    }

EnableAutoConfiguration

  • Ingrese la anotación @EnableAutoConfiguration , puede ver la anotación @Import (importar una clase AutoConfigurationImportSelector para realizar la importación de la clase de configuración), la anotación @AutoConfigurationPackage (función: escanear todos los componentes bajo el paquete y subpaquetes de la clase donde se encuentra la anotación al contenedor Spring IoC)
    • AutoConfigurationImportSelector: AutoConfigurationImportSelector implementa la interfaz DeferredImportSelector y la interfaz DeferredImportSelector hereda de ImportSelector . En ImportSelector , solo hay un método abstracto: selectImports , que devuelve un String [] . En esta matriz, puede especificar la clase que debe ensamblarse en el contenedor de IoC. Después de importar una clase de implementación en @Import, el nombre de clase devuelto en la clase de implementación se cargará en el contenedor de IoC.
      Inserte la descripción de la imagen aquí
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
		ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
    
    }
public interface DeferredImportSelector extends ImportSelector {
    
    }
public interface ImportSelector {
    
    
    String[] selectImports(AnnotationMetadata var1);
}

La diferencia con @Configuration es: ImportSelector puede realizar el ensamblaje por lotes y el ensamblaje selectivo a través del procesamiento lógico .

Análisis del principio de montaje automático

El núcleo del ensamblaje automático es escanear los archivos en el directorio acordado para su análisis y, una vez finalizado el análisis, importar la clase de configuración de configuración obtenida a través de @ImportSelector para completar el proceso de ensamblaje automático de Bean. Cuando se inicia el proyecto, las operaciones relacionadas de ensamblaje automático se llevarán a cabo mediante el método de proceso de AutoConfigurationImportSelector. La esencia es llamar al método getAutoConfigurationEntry para obtener todas las clases de configuración que deben ensamblarse automáticamente.
Operación real: inicie un proyecto SpringBoot, ingrese AutoConfigurationImportSelector, interrumpa los puntos en todas las llamadas al método getAutoConfigurationEntry y ejecute el método principal de inicio.

  • selectImports (ejecutado solo en el escenario de configuración selectiva por lotes)
  • getAutoConfigurationEntry (ejecutar)
  • proceso (ejecución)

Concéntrese en el método getAutoConfigurationEntry , vamos a ampliar lo que hace este método.

protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
			AnnotationMetadata annotationMetadata) {
    
    
    if (!isEnabled(annotationMetadata)) {
    
    
        return EMPTY_ENTRY;
    }
    // 获取@EnableAutoConfiguration注解中的属性exclude、excludeName等
    AnnotationAttributes attributes = getAttributes(annotationMetadata);
    // 获得所有自动装配的配置类(后续会展开说明)
    List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
    // 去除重复配置项
    configurations = removeDuplicates(configurations);
    // 根据@EnableAutoConfiguration注解中的属性exclude,移除不需要自动装配的配置类
    Set<String> exclusions = getExclusions(annotationMetadata, attributes);
    // 对于不属于AutoConfiguration的exclude报错
    checkExcludedClasses(configurations, exclusions);
    // 从configurations去除exclusions
    configurations.removeAll(exclusions);
    // 由所有AutoConfigurationImportFilter类的实例再进行一次筛选
    configurations = filter(configurations, autoConfigurationMetadata);
    // 广播事件,把AutoConfigurationImportEvent绑定在所有AutoConfigurationImportListener子类实例上,主要用于声明打印相关配置类内容
    fireAutoConfigurationImportEvents(configurations, exclusions);
    // 返回(configurations, exclusions)组
    return new AutoConfigurationEntry(configurations, exclusions);
}

El punto clave es: ¿Qué significa la getCandidateConfigurations ? Método no SpringFactoriesLoader se utiliza aquí . Es un método de carga convencional provisto internamente, de forma similar a la SPI [Mecanismo de descubrimiento de servicios] en Java , que escanea la META-INF / spring.factories de la classpath . El archivo, el archivo spring.factories se almacena en forma KV **, el método loadFactoryNames obtendrá el valor de valor correspondiente de acuerdo con la clave . Aquí la clave es EnableAutoConfiguration , Value son varias clases de configuración, es decir , el valor de retorno de getCandidateConfigurations .

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    
    
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                                                                         getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                    + "are using a custom packaging, make sure that file is correct.");
    return configurations;
}

Inserte la descripción de la imagen aquí


Para resumir: cuatro pasos

  • Realice la importación de la clase de configuración a través de @Import (AutoConfigurationImportSelector.class)
  • AutoConfigurationImportSelector implementa la interfaz ImportSelector e implementa la carga de ensamblado de la clase de configuración a través del método getAutoConfigurationEntry
  • A través del mecanismo SpringFactoriesLoader de Spring, escanee la ruta de la ruta de clases y lea las clases de configuración que deben ensamblarse automáticamente desde el archivo META-INF / spring.factories
  • Filtrar por condiciones, filtrar y eliminar , y finalmente completar el montaje.

Montaje condicional

@Conditional , proporciona restricciones condicionales de ensamblaje automático, generalmente utilizadas junto con @Configuration y @Bean . Acepta una matriz de Condición [] . La condición es una interfaz funcional que proporciona un método de coincidencias y proporciona una regla de coincidencia. Si se cumple la regla, se puede inyectar, de lo contrario, no se inyectará. Proporciona juicio contextual para la carga de Bean.

@Target({
    
    ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
    
    

	/**
	 * All {@link Condition Conditions} that must {@linkplain Condition#matches match}
	 * in order for the component to be registered.
	 */
	Class<? extends Condition>[] value();

}
@FunctionalInterface
public interface Condition {
    
    

	/**
	 * Determine if the condition matches.
	 * @param context the condition context
	 * @param metadata the metadata of the {@link org.springframework.core.type.AnnotationMetadata class}
	 * or {@link org.springframework.core.type.MethodMetadata method} being checked
	 * @return {@code true} if the condition matches and the component can be registered,
	 * or {@code false} to veto the annotated component's registration
	 */
	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

@Conditional expande el formulario de uso: proporciona mejor juicio de contexto para la carga automática, deja que Spring decida si cargar la clase de configuración.

anotación sentido
@ ConditionOnBean / @ ConditionOnMissingBean Cargar cuando un Bean existe o no existe en el contenedor
@ ConditionOnClass / @ ConditionOnMissingClass Cargar cuando la clase especificada existe o no existe en el contenedor
@ConditionOnCloudPlatform Cargar en la plataforma de nube designada
@ConditionOnExpression Carga basada en juicio condicional de expresión SqEI
@ConditionOnJava Ejecute la versión especificada de Java para cargar
@ConditionOnJndi El recurso especificado se puede cargar solo después de que se cargue a través de JNDI
@ ConditionOnWebApplication / @ ConditionOnNotWebApplication Cargar cuando sea o no una aplicación web
@ConditionOnProperty Especifique si el atributo tiene un valor correspondiente para cargar
@ConditionOnResource El bean que se cargará depende del recurso especificado que exista en la ruta de clases para cargar
@ConditionOnSingleCandidate Cargar al determinar un solo candidato para un Bean determinado

Además, Spring-Autoconfiguration-Metadata proporcionados en los documentos condicionan la configuración automática del lote de ensamblaje, la configuración del formato de archivo requerida para cumplir:

  • La ruta y el nombre del archivo de configuración deben ser: /META-INF/spring-autoconfigure-metadata.properties
  • El formato de configuración de la clave en el archivo de configuración es: el nombre de ruta completo de la clase de configuración automática. Condición = Valor

Supongo que te gusta

Origin blog.csdn.net/Nerver_77/article/details/108237124
Recomendado
Clasificación