210630: configuración automática de springBoot-inicio personalizado
El código fuente de Spring Boot para la configuración automática está en spring-boot-autoconfigure-x.x.x.x.jar:
Por supuesto, el documento oficial no parece mencionar la descripción relevante de la configuración automática. principio. Sin embargo, no es difícil para nosotros adivinar que hay una anotación @SpringBootApplication en la clase de inicio Spring Boot. Esta anotación es una anotación esencial para el proyecto Spring Boot. ¡Entonces el principio de configuración automática debe estar indisolublemente ligado a esta anotación!
@SpringBootApplication es una anotación compuesta o una anotación derivada. Hay una anotación @EnableAutoConfiguration en @SpringBootApplication, traducida al lenguaje humano, significa habilitar la configuración automática.
Y esta anotación también es una anotación derivada en la que las funciones clave las proporciona @Import. El método selectImports() del AutoConfigurationImportSelector importado escanea todos los paquetes jar con META-INF/spring.factories a través de SpringFactoriesLoader.loadFactoryNames(). Existe un archivo spring.factories de este tipo en spring-boot-autoconfigure-x.x.x.x.jar.
Este archivo spring.factories también tiene la forma de un grupo de clave = valor. Una de las claves es el nombre de clase completo de la clase EnableAutoConfiguration y su valor es una lista de nombres de clases xxxxAutoConfiguration. Estas clases Los nombres están separados por comas, como se muestra en la siguiente figura:
Esta anotación @EnableAutoConfiguration está marcada indirectamente en la clase de inicio Spring Boot a través de @SpringBootApplication. El método selectImports() se ejecutará dentro de SpringApplication.run(...), buscará las clases correspondientes a los nombres completos de todas las clases de configuración automática de JavaConfig y luego cargará todas las clases de configuración automática en el contenedor Spring.
Cada clase de configuración automática de XxxxAutoConfiguration entrará en vigor bajo ciertas condiciones. Las restricciones de estas condiciones se reflejan en forma de anotaciones en Spring Boot. Las anotaciones condicionales comunes incluyen las siguientes:
Toma. Tome la clase de configuración ServletWebServerFactoryAutoConfiguration como ejemplo, explique cómo surten efecto los atributos en el archivo de configuración global, como: server.port = 8081, cómo surte efecto (por supuesto, habrá un valor predeterminado si no se configura, este valor predeterminado viene desde org.apache.catalina.startup.Tomcat).
En la clase ServletWebServerFactoryAutoConfiguration, hay una anotación @EnableConfigurationProperties: Habilitar propiedades de configuración, y el parámetro detrás de ella es una clase ServerProperties. Este es el punto final del hábito sobre la configuración.
En esta clase, vemos una anotación muy familiar: @ConfigurationProperties. Su función es vincular propiedades del archivo de configuración al bean correspondiente, y @EnableConfigurationProperties es responsable de importar esta propiedad vinculada. las propiedades se agregan al contenedor de resorte (ver captura de pantalla arriba). Entonces todas las demás propiedades relacionadas con esta clase se pueden definir en el archivo de configuración global. En otras palabras, la clase que realmente "limita" qué propiedades podemos configurar en el archivo de configuración global son estas clases XxxxProperties, que son las mismas que las definidas. en el archivo de configuración, el conjunto de atributos que comienzan con la palabra clave de prefijo se corresponden de forma única.
En este punto, podemos entenderlo a grandes rasgos. Las propiedades configuradas globalmente, como server.port, etc., están vinculadas a la clase de entidad de configuración XxxxProperties correspondiente a través de la anotación @ConfigurationProperties, encapsuladas como un bean y luego importadas al contenedor Spring a través de la anotación @EnableConfigurationProperties.
Muchas clases de configuración automática de XxxxAutoConfiguration son la forma JavaConfig del contenedor Spring. Su función es importar beans para el contenedor Spring, y todas las propiedades requeridas por los beans importados se obtienen a través de los beans de xxxxProperties.
Es posible que todavía tengas dudas hasta el momento, pero durante la entrevista, no es necesario que respondas de manera tan específica. Solo debes responder así:
Starter puede entenderse como. Posibles complementos conectables, que proporcionan un conjunto conveniente de descriptores de dependencia, puede obtener un servicio integral para todas las tecnologías Spring y relacionadas que necesita. La aplicación solo necesita introducir la dependencia inicial en maven, y SpringBoot puede escanear automáticamente la información que se cargará e iniciar la configuración predeterminada correspondiente. Descrito en una oración, es el iniciador de escenas de Springboot.
Los nombres de inicio definidos oficialmente son spring-boot-starter-xxx. Los que definimos nosotros mismos son generalmente xxx-spring-boot-starter. Cree un nuevo ruangh-id-gengerate-spring-boot-starter. project
Importe el paquete springboot spring-boot-starter
Defina una configuración de mapeo de las nuevas clases IdProperties y LockieProperties, agregue la anotación ConfigurationProperties("machine.id"), nuestro archivo de configuración. termina con Comienza con machine.id, como mathine.id.name=boot-order, y otra configuración comienza con spring.lockie
Hay un método getId en IdService para generar una ID personalizada p>
Cree el directorio META-INF en el directorio de recursos y agregue el archivo spring.factories. Configure EnableAutoConfiguration en este archivo, de la siguiente manera:
Cree un módulo y agregue dependencias en el archivo pom
Agregue anotaciones a la clase de inicio
Agregue configuración al Parámetros del archivo de configuración
Agregar clase de prueba
Ejecútelo para verificar los resultados y vea que los resultados son los que queremos. En este punto, hemos personalizado con éxito un iniciador. , necesitamos crear 3 clases. 1 archivo de configuración, xxProperties, xxService, xxAutoConfiguation y spring.factories