Red de conocimiento informático - Computadora portátil - @Importar({AutoConfigurationImportSelector.class})

@Importar({AutoConfigurationImportSelector.class})

(2) @Import ({AutoConfigurationImportSelector.class}): importa la clase AutoConfigurationImportSelector al contenedor Spring. AutoConfigurationImportSelector puede ayudar a las aplicaciones Springboot a cargar todas las configuraciones @Configuration elegibles en el contenedor IoC actual (ApplicationContext) creado y utilizado por SpringBoot

Continúe estudiando la clase AutoConfigurationImportSelector, que se puede analizar a través del código fuente mediante el método selectImports. Dígale a Springboot qué componentes deben importarse:

! [image-20200119172227144](./images/image-20200119172227144.png)

¡Profundizando en el método loadMetadata

! [image-20200119172325325](./images/image-20200119172325325.png)?

Comprensión profunda del método getCandidateConfigurations

Existe un método importante loadFactoryNames, que permite a SpringFactoryLoader cargar cierto El nombre del componente.

! [image-20200119172418984] (. /images/image-20200119172418984.png)

Continúe haciendo clic en el método loadFactory

```java

?public static ListloadFactoryNames (Class factoryClass, @Nullable ClassLoaderclassLoader) {

//teclas de entrada/salida

String factoryClassName = factoryClass.getName();

return( Lista ) loadSpringFactories(classLoader).getOrDefault(factoryClassName,Collections.emptyList());

}

Mapa estático privado>.loadSpringFactories(@Nullable ClassLoader classLoader) {

Resultado de MultiValueMap =(MultiValueMap)cache.get(classLoader);

if (resultado! = null) {

devolver resultado;

} else {

p>

try {

// Si classLoader no es nulo, cargue el archivo spring.factories y encapsule la información de ruta completa de la clase de configuración establecida en él como una enumeración objeto de clase

enumeración de URL = cargador de clases! = nulo ?classLoader.getResources("META-INF/spring.factories") :ClassLoader.getSystemResources("META-INF/spring.factories");

Resultado de LinkedMultiValueMap =nuevo LinkedMultiValueMap(); p>

// Bucle para enumerar objetos de clase, generar objetos de Propiedades en función de la información del nodo correspondiente, obtener valores pasando claves y convertir valores en cadenas pequeñas cortándolos en matrices, colección de resultados del método

while(urls.hasMoreElements()) {

URL url = (URL)urls.nextElement();

UrlResource recurso = newUrlResource(url);

Propiedades propiedades = PropertiesLoaderUtils.entrySet().iterator();

while(var6.hasNext()) {

Entrada entrada= (Entrada)var6 .next();

String factoryClassName= ((String) entrada.getKey()).trim()

String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entrada .getValue())

int var10 = var9.leng

th;

for(int var11 = 0;var11 < var10; ++var11) {

String factoryName= var9[var11];

resultado.add (nombre de clase de fábrica);

resultado.add(nombre de clase de fábrica);

resultado.add(nombre de clase de fábrica

resultado.add(nombre de clase de fábrica)add(nombre de clase de fábrica, nombre de fábrica); .trim());

}

}

}

cache.put(classLoader, resultado);

devuelve resultado;

```

Leerá un archivo sprin?factories. Si no se puede leer, informará este error. Continuaremos leyendo de acuerdo. a lo que veremos La ruta final es así, y esta es una clase de herramienta proporcionada por Spring

```java

public final class SpringFactoriesLoader {

<. p> cadena final estática pública FACTORIES_RESOURCE_LOCATION = " META-INF/spring.FACTORIES_RESOURCE_LOCATION = "META-INF/spring";

}

```

En realidad, carga un archivo externo, el archivo se encuentra en

! p>! -20191226162832498.png)

@EnableAutoConfiguration simplemente busca el archivo de configuración META-INF/spring.factories desde el classpath y usa la reflexión (Java Reflection) para org.springframework.boot.autoconfigure.EnableutoConfiguration correspondiente al elemento de configuración ¿Crear una instancia de la clase de configuración correspondiente en forma de JavaConfig marcada como @Configuration y cargarla en el contenedor IOC?

Tome el proyecto de ahora como ejemplo. Agregue el Lanzador de dependencia del entorno web al proyecto y la clase de configuración automática WebMvcAutoConfiguration correspondiente entrará en vigor. Abra la clase de configuración automática y pase la anotación completa de la configuración. clase, incluido el prefijo predeterminado, el prefijo predeterminado, el sufijo predeterminado, la resolución de vista, el validador MVC, etc., busque la clase de configuración para la configuración predeterminada del entorno requerido para que se ejecute Spring MVC. La esencia de estas clases de configuración automática es el archivo de configuración XML correspondiente en el marco tradicional Spring MVC, pero están preconfigurados en forma de clases de configuración automática en Spring Boot.

Por lo tanto, después de agregar el iniciador de dependencia relevante en el proyecto Spring Boot, básicamente no se requiere configuración para ejecutar el programa. Por supuesto, ¿también podemos cambiar la configuración predeterminada de estas clases de configuración automática?

***Resumen*** Por lo tanto, los pasos para implementar la configuración automática en la parte inferior de Springboot son:

1. Inicio de la aplicación Springboot;

2. .@ SpringBootApplication funciona;

3.@ EnableAutoConfiguration;

4.@AutoConfigurationPackage: el foco de esta anotación combinada es @Import (AutoConfigurationPackages.Registrar.class), que se utiliza para importe la clase Registrar al contenedor, y la función de la clase Registrar es escanear la clase de configuración principal y los directorios hermanos de los subpaquetes, e importar los componentes correspondientes al contenedor creado y administrado por Springboot;

5.

@Import(AutoConfigurationImportSelector.class): Importa la clase AutoConfigurationImportSelector al contenedor. La función de la clase AutoConfigurationImportSelector se ejecutará a través del método selectImports. La clase de herramienta interna SpringFactoriesLoader. Se utiliza todo lo que se encuentra en la ruta de clase META-INF/spring.Path del paquete jar y se carga en el contenedor. La fábrica está cargada para implementar una serie de procesos de creación de contenedores que transfieren información de clase de configuración al cargador SpringFactory

Acabo de estudiar el "Campamento de entrenamiento de salario alto para ingenieros de Java" de Lagou Education y vi los puntos de conocimiento que acabo de aprender. . Acabo de responder. Espero que Lagou pueda impulsarme a la empresa a la que quiero ir, objetivo: ¡ByteDance!