Análisis del principio de inicio de SpringBoot
Cuando hablé de @EnableAutoConfiguration anteriormente, mencioné el archivo spring.factories en META-INF. Entonces, ¿cómo carga Spring este archivo? En realidad, es la clase SpringFactoriesLoader.
SpringFactoriesLoader es un cargador de fábrica universal utilizado internamente por Spring. Factory
Carga EnvironmentPostProcessor (permite personalizar la configuración del entorno antes de construir la aplicación Spring)
A continuación carga el PropertySourceLoader de propiedades y YAML (cargador de dos archivos de configuración SpringBoot)
p>
Varios FailureAnalyzers (intérpretes de excepciones)
Carga varias configuraciones automáticas implementadas dentro de SpringBoot
Motor de plantillas TemplateAvailabilityProvider (como Freemarker, Thymeleaf, Jsp, Velocity, etc. < / p>
En resumen, la función general de SpringFactoriesLoader combinado con @EnableAutoConfiguration es encontrar el archivo spring.facts y cargar la clase de configuración automática
Todo el proceso de inicio
Ejecutar la clase de entrada Después del método principal, ejecutaremos SpringApplication.run, que luego creará un nuevo objeto SpringApplication y luego ejecutará su método de ejecución
Inicializa la clase SpringApplication
. Se llamará al crear el objeto SpringApplication. Propio método de inicialización
Ejecutar el método de ejecución principal
Después de ejecutar el método de inicialización de inicialización, llamará al método de ejecución para iniciar SpringBoot
p>
Primero, atravesará SpringFactoriesLoader para encontrar todos los SpringApplicationRunLoaders disponibles en META-INF/spring.factories y crear una instancia de ellos llamando a su método de inicio () para notificar a estos oyentes que la aplicación SpringBoot se está iniciando.
Cree y configure el entorno que utilizará la aplicación SpringBoot actual, incluido el PropertySource y el perfil actualmente válidos
Recorra todos los SpringApplicationRunListeners y llame al método EnvironmentPrepared() de todos los SpringApplicationRunListeners para notificar a estos oyentes de las aplicaciones SpringBoot. Se ha inicializado el entorno del programa.
Imprime el banner de la aplicación SpringBoot. Cuando la propiedad showBanner de SpringApplication es verdadera, si el archivo banner.txt existe en la ruta de clases, se imprimirá el contenido del archivo; de lo contrario, se imprimirá el banner predeterminado;
Según la configuración de inicio de la aplicación SpringBoot,
cree un applicationContext basado en la applicationContextClass configurada al inicio y el WebEnvironment establecido en el método de inicialización.
Cree un analizador de excepciones para manejar excepciones (incluido el registro, la liberación de recursos, etc.) cuando se produzca una excepción durante el inicio.
Configure el entorno SpringBoot, registre el serializador de nombres Spring Bean BeanNameGenerator y configure el cargador de recursos ResourceLoader (cargado a través de SpringFactoriesLoader).
Llame al método de inicialización para inicializar aún más el ApplicationContext creado.
Llame al método contextPrepared de todos los SpringApplicationRunListeners para notificar a estos oyentes que se ha creado el ApplicationContext actual.
El paso principal es cargar toda la configuración obtenida previamente a través de @EnableAutoConfiguration y otras formas de configuración del contenedor IoC en el ApplicationContext preparado.
Llame al método contextLoaded de todos los SpringApplicationRunListeners para cargar el ApplicationContext preparado.
Llame a refrescoContext para registrar ShutdownHook para detener el programa y cerrar el contenedor Spring cuando se liberen recursos (incluido: destruir beans, cerrar fábricas de creación de SpringBean, etc.).
Nota: El gancho se puede llamar en las siguientes circunstancias:
1) El programa sale normalmente
2) Usando System.exit ()
3) Usar System.Exit ()
4) Usar System.Exit ()
5) Usar System.Exit ()exit ()
3 ) La terminal usa una interrupción activada por Ctrl + C
4) Apagado del sistema
5) Utilice el comando Kill pid para finalizar el proceso
Obtenga todas las clases de implementación actuales de la interfaz ApplicationRunner y CommandLineRunner y ejecute su método de ejecución
Recorra el método terminado() de todos los SpringApplicationRunListener para completar el inicio de SpringBoot.