Principio de configuración automática de Spring Boot 2

Tabla de contenido

1. ¿Cuál es la función de la anotación @AutoConfigurationPackage?

2. ¿Qué está haciendo @Import(AutoConfigurationImportSelector.class)?

3. ¿Cómo implementa Spring MVC la configuración automática en Spring Boot?


Cualquiera que haya usado Spring Boot y sea guapo sabe que siempre que haya una anotación @SpringBootApplication en la clase de inicio de la aplicación, es una aplicación Spring Boot y los beans necesarios se configurarán automáticamente. ¿Cómo lo hiciste?

La única pista es la anotación @SpringBootApplication en sí. Ctrl + clic para abrir esta anotación, verá que tiene otras 3 anotaciones adjuntas (excepto @Target y otras metaanotaciones), una de las cuales @EnableAutoConfiguration está relacionada con la configuración automática que queremos estudiar, abre la automática configuración de todo el conmutador del proyecto.

¿Cómo habilita esta anotación la configuración automática? Continúe con Ctrl + clic para abrir la anotación @EnableAutoConfiguration y verá dos anotaciones adjuntas.

Parece que el secreto está en eso, necesitamos estudiar estas dos anotaciones cuidadosamente . ¡Mira el primero!

1. ¿Cuál es la función de la anotación @AutoConfigurationPackage?

Haga clic en esta anotación y verá que no hay nada más, pero se importa una clase interna denominada AutoConfigurationPackages.Registrar.

Haga clic en la clase Registrar y descubra que implementa la interfaz ImportBeanDefinitionRegistrar del marco Spring, luego Spring llamará al registerBeanDefinitions() que implementa al inicio. El método register() se llama en registerBeanDefinitions() para ver cuál es el nombre del método que se registra, supongo. >_>

Eche un vistazo a las operaciones complicadas en el método register(). ¿No puedes entender este código? Debe crear un punto de interrupción aquí para depurar.

Mire este código, cree un Bean a través del código, el tipo es BasePackage (paquete básico), establezca el nombre del paquete básico de este proyecto cn.itrip, y finalmente registre el Bean en el contenedor Spring IoC, el Bean El nombre es org .springframework.boot.autoconfigure.AutoConfigurationPackages. De hecho, esta es otra forma de registrar beans en el contenedor IoC en Spring, que tiene el mismo efecto que agregar anotaciones @Service y @Component a la clase.

En resumen, el objetivo principal de la anotación @AutoConfigurationPackage es agregar el paquete cn.itrip a la colección de paquetes que deben configurarse automáticamente. No es de extrañar que el paquete del mismo nivel donde se encuentra la clase de inicio del proyecto Spring Boot configurará automáticamente el Bean, que es la entrada agregada aquí.

2. ¿Qué está haciendo @Import(AutoConfigurationImportSelector.class)?

En primer lugar, debe comprender que la interfaz ImportSelector proporcionada por el marco Spring se usa para importar selectivamente clases anotadas con @Configuration. La clase AutoConfigurationImportSelector importada aquí implementa la interfaz ImportSelector, por lo que Spring Framework llamará a su proceso() al inicio.

Mire la captura de pantalla de la depuración anterior, la esquina inferior izquierda es la ruta de llamada de la pila de subprocesos y el orden de llamada es proceso() -> getAutoConfigurationEntry() -> getCandidateConfigurations(). No nos importa lo que suceda en el medio, pero cuando llegamos al método getCandidateConfigurations(), podemos ver que aquí hay una afirmación Assert, y el mensaje de error dice que la clase de configuración automática no se puede encontrar en el META- Archivo INF/spring.factories.

Al rastrear más este método, llama a SpringFactoriesLoader.loadFactoryNames() -> loadSpringFactories() y, de hecho, lo carga en META-INF/spring.factories. Entonces, ¿cuál es el tesoro dentro de este archivo? Abra este archivo y eche un vistazo, está en el paquete jar de configuración automática de Spring Boot.

Puede ver que el archivo spring.factories enumera las clases de configuración automática de varios módulos, marcos de trabajo de terceros o middleware que Spring puede integrar, y los nombres de las clases tienen la forma de Xxx AutoConfiguration. Estas  configuraciones automáticas de Xxx están en realidad en el mismo paquete jar y son responsables de la configuración automática de beans para módulos importados y marcos de trabajo de terceros.

Cómo hacerlo, tomemos como ejemplo el framework SpringMVC comúnmente utilizado en nuestros proyectos Web.

3. ¿Cómo implementa Spring MVC la configuración automática en Spring Boot?

Sabemos que para usar el marco Spring MVC en Spring Boot, solo necesita importar un iniciador spring-boot-starter-web. Spring XML tradicional necesita configurar tantos beans, y ya no necesitamos configurarlos, entonces, ¿es ese el motivo de la configuración automática? De acuerdo con la sección anterior, primero observe la configuración automática de la web en el archivo spring.factories y qué clases de configuración automática se enumeran.

De acuerdo con la experiencia, mire el nombre y adivine primero, DispatcherServlet, el controlador front-end de Spring MVC, debe ser creado por la primera clase DispatcherServletAutoConfiguration en el cuadro rojo de arriba. Para confirmar, abra la clase DispatcherServletAutoConfiguration y eche un vistazo.

Lo primero que ve son algunas anotaciones en la clase.

  • La anotación @AutoConfigurationOrder especifica el orden de ejecución, que se ejecuta primero;
  • La anotación @Configuration indica que esta clase se puede usar para definir varios métodos de fábrica con @Bean;
  • La anotación @ConditionOnWebApplication indica que el Bean de esta clase solo se configurará en el entorno del proyecto Web;
  • @ConditionOnClass(DispatcherServlet.class) indica que el Bean de esta clase solo se configurará si importa las dependencias del paquete Spring MVC (la clase DispatcherServlet se puede buscar en classpath);
  • La anotación @AutoConfigureAfter especifica que para configurar el Bean de esta clase, primero se debe crear el Bean de la clase ServletWebServerFactoryAutoConfiguration.

Como se puede ver en las constantes del código anterior, el controlador frontal configurado automáticamente, el nombre del Bean en el contenedor IoC también se llama dispatcherServlet.

Por supuesto, hay otra clase que hay que decir sobre la configuración automática de Spring MVC, que es  la clase WebMvcAutoConfiguration. Los beans como los analizadores de vista y los convertidores de mensajes que Spring MVC tradicional necesita configurar en xml se crean en esta clase de configuración automática.

Escribir código todos los días es tan aburrido, ¡juguemos juntos la cuenta de video de WeChat!

 

Supongo que te gusta

Origin blog.csdn.net/liudun_cool/article/details/108193207
Recomendado
Clasificación