Red de conocimiento informático - Problemas con los teléfonos móviles - Principios básicos de SpringBoot: configuración automática, basada en eventos, condición

Principios básicos de SpringBoot: configuración automática, basada en eventos, condición

SpringBoot es una encapsulación de Spring. A través de la configuración automática, SpringBoot se puede usar de inmediato. El costo de entrada es muy bajo, pero el costo de aprender sus principios de implementación aumenta considerablemente. Es necesario estar familiarizado con los principios de Spring.

Si aún no conoce los principios de Spring, puede consultar primero los artículos anteriores del blogger. Este artículo analiza principalmente el inicio, la configuración automática, la condición y los principios controlados por eventos de SpringBoot.

Iniciar SpringBoot es muy sencillo, porque tiene Tomcat integrado, por lo que sólo necesitas iniciarlo de las siguientes maneras:

Como puedes ver, el primer método es el El más simple y más comúnmente utilizado De esta manera, debe tener en cuenta que la anotación @SpringBootApplication debe marcarse encima de la clase, que es el núcleo para realizar la configuración automática. Esta es la implementación principal de la configuración automática, que analizaremos más adelante, pero primero echemos un vistazo a lo que hace SpringBoot al inicio.

Antes de continuar, adivinemos lo que debemos hacer en el método de ejecución. Comparando el código fuente de Spring, sabemos que el inicio de Spring creará un objeto de contexto de aplicación ApplicationContext y llamará a su método de actualización para iniciar el contenedor. SpringBoot es solo una capa del shell Spring y ciertamente no puede evitar tales operaciones.

Por otro lado, los proyectos creados por Spring en el pasado necesitaban publicar el paquete War en Tomcat, pero ahora SpringBoot tiene Tomcat integrado y solo necesita escribir el paquete Jar para comenzar, por lo que también debe estar en el método de ejecución. Se creará e iniciará el objeto Tomcat correspondiente. Lo anterior es solo nuestra suposición. Verifiquemos el método de ejecución:

Existe este método durante el proceso de inicio de SpringBoot. Primero, eche un vistazo al método getRunListeners. Este método es para obtener todas las clases implementadas por SpringApplicationRunListener. Estas clases se utilizan para la publicación de eventos SpringBoot. Analizaremos el controlador de eventos más adelante. Aquí analizamos principalmente el principio de implementación de este método:

Siguiendo el seguimiento paso a paso, podemos. Vea que al final se basa en el tipo de interfaz de META a través del mecanismo SPI. La implementación correspondiente se carga en el archivo INF/spring.Factory. La implementación correspondiente y la creación de instancias de la clase cargada en el archivo de fábricas es la configuración automática de SpringBoot.

¿Por qué hacer esto? ¿Por qué hacer esto? ¿No podemos simplemente escanear las anotaciones directamente? Por supuesto, puede importar clases mediante la anotación @Import, pero este método no es adecuado cuando hay muchas clases de extensión, por lo que la ventaja de usar SPI aquí es obvia.

Volviendo al método de ejecución, puede ver que llama al método createApplicationContext, que, como su nombre indica, se utiliza para crear el objeto de contexto de la aplicación:

Observe que un nuevo uno se crea una instancia a través de la reflexión, un objeto de contexto invisible. AnnotationConfigServletWebServerApplicationContext, esta es una extensión de SpringBoot, consulte su constructor:

Si ha visto el principio de implementación basada en anotaciones de Spring, no estará familiarizado con estos dos objetos. Uno de ellos realmente admite anotaciones. analizar y el otro es para escanear paquetes. Uno admite el análisis de anotaciones y el otro se utiliza para escanear paquetes.

Después de crear el contexto, el siguiente paso es llamar al método de actualización para iniciar el contenedor:

Lo primero que debe hacer aquí es llamar a la clase principal ServletWebServerApplicationContext:

Como puedes ver, delega directamente a la clase padre:

Este método no es nuevo, ¿verdad? Este método no es desconocido y se ha analizado antes, por lo que no entraré en detalles aquí. De esta manera, se inicia el contenedor SpringBoot, pero ¿dónde se inicia Tomcat? El método de ejecución no es visible.

De hecho, Tomcat también se inicia durante el proceso de actualización. Un paso en este método es llamar al método onRefresh. Este es un método de plantilla que no está implementado en Spring, y SpringBoot lo completa a través de este método. Inicie Tomcat:

Aquí primero obtenga el objeto TomcatServletWebServerFactory y luego cree e inicie Tomcat a través de este objeto:

Cada uno de los pasos anteriores se puede comparar con el archivo de configuración de Tomcat. Cabe señalar que el valor predeterminado Solo se admite el método e y también es un método de plantilla. La lógica de coincidencia específica se implementa en este método. El método devuelve un objeto ConditionOutcome, que contiene dos campos: información de coincidencia y de registro. En la clase OnBeanCondition:

Puede ver que esta clase admite las anotaciones @ConditionalOnBean, @ConditionalOnSingleCandidate y @ConditionalOnMissingBean. La lógica de coincidencia principal está en el método getMatchingBeans:

La lógica aquí se ve. como Complex, pero en realidad hace dos cosas: primero, llama a beanFactory. Primero, llama al método beanFactory.getBeanNamesForType a través del método getNamesOfBeansIgnoredByType y luego devuelve una instancia de bean según los resultados devueltos.

En este proceso, BeanFactory devuelve una instancia de bean a través del método getNamesOfBeansIgnoredByType y luego determina qué beans existen y cuáles no en función de los resultados devueltos (la anotación de condición se puede configurar con múltiples valores) y devuelve un objeto MatchResult y MatchResult devuelve false siempre que un bean no coincida, lo que determina si es necesario crear una instancia del bean actual.

Este artículo analiza la implementación de los principios básicos de SpringBoot. A través de este artículo, creo que los lectores pueden usar y ampliar SpringBoot con más habilidad.

Además, hay algunos componentes de uso común que no he analizado, como transacciones, MVC y configuración automática del oyente. Todos tenemos el código fuente de Spring como base para estos. Échale un vistazo, lo entenderás. No quiero entrar en detalles aquí.

Finalmente, los lectores pueden pensar en cómo debemos personalizar el iniciador. Creo que no será difícil derrotarlos después de leer este artículo.

Finalmente, los lectores pueden pensar en cómo debemos personalizar el iniciador.