Análisis del código fuente de la configuración externa de SpringBoot: configuración y parámetros de demostración práctica completa

Combate real completo

En este capítulo, explicamos los principios y el análisis del código fuente de la configuración externa de Spring Boot. En esta sección, usamos un ejemplo específico para demostrar brevemente cómo usar diferentes tipos de parámetros y configuraciones en Spring Boot. También presentaremos y ampliaremos brevemente algunos de los nuevos puntos de conocimiento involucrados en los ejemplos de esta sección.

En los ejemplos de esta sección, usaremos la línea de comando para pasar parámetros, el archivo de configuración predeterminado application.properties, los parámetros de configuración del perfil, la anotación @Value para obtener parámetros y las funciones de bean relacionadas con la anotación @ConfigurationProperties de seguridad de tipos.

Dado que Spring Boot ha simplificado la configuración de externalización, es muy conveniente para nosotros usarlo en la práctica de acuerdo con la introducción de principios relacionados en el capítulo anterior. Aquí creé un proyecto Spring Boot estándar, la versión es 2.2.1.RELEASE. Primero miramos la estructura de directorios del proyecto.

La dependencia principal introducida en pom.xml es spring-boot-starter-web, y el código fuente de dependencia correspondiente es el siguiente.

<dependencia>  
<groupId> org. Springframework. boot </ groupId> 
<artifactId> spring- boot-  starter-web </artifactId>  
</ dependency> 

La clase SpringbootConfigApplication es la clase de inicio del proyecto Spring Boot, no presentaremos demasiado.

La clase ConfigController es el Controller que recibe la solicitud. Define un método getConfigParams predeterminado en ella. Los valores de los parámetros obtenidos de diferentes formas se imprimen en este método. El código fuente relevante es el siguiente.

@RestController  
public class ConfigController {  
@Value ("$ {user. Username}")  
private String username; 
@Value ("$ {usuario. Contraseña}")  
contraseña de cadena privada; 
@Resource  
private LoginUserConfig loginUserConfig; 
@Value ("$ {projectName: unknown}")  
private String projectName; 
@RequestMapping ("/")  
public String getConfigParams () {  
// 启动 命令 传递 参数 
System. fuera . println ("Command config projectName:" + projectName); // 通过 aplicación 文件 配置 的 参数 
System. fuera . println ("Nombre de usuario de configuración de la aplicación  
System. out. println (" Contraseña de configuración de la aplicación: ”+ contraseña);   
// Parámetros configurados a través de la anotación @ConfigurationProperties 
System. out. println ("  
UserConfig.  
getUsername ());  
System. out. println ("Configurat ionProperties config Password:” + login  
UserConfig.  
getPassword ()); 
regreso ""; 

La anotación @RestController se usa para especificar esta clase como un controlador que puede recibir solicitudes y crear una instancia. Dentro de esta clase, los parámetros configurados de diferentes formas se obtienen a través de la anotación @Value y la anotación @Resource. Proporcionar solicitudes de acceso externo a través del método getConfigParams. Después de recibir la solicitud, imprimirá diferentes formas de obtener el valor del parámetro.

Primero, veamos la fuente del valor obtenido a través de @Value. En este ejemplo, hay dos formas de establecer el valor correspondiente:

application.properties archivo de configuración y parámetros de línea de comando.

En cuanto a los parámetros de la línea de comandos, ya hemos mencionado que el método de transferencia básico es pasar el comando en forma de "un nombre = valor" al ejecutar el comando para iniciar el proyecto. Combinando los ejemplos, el método de transferencia es el siguiente.

java -jar springboot-config-0. 0.1- INSTANTÁNEA. jar - projectName = SpringBoot 

En la clase ConfigController, podemos ver que el formato básico de @Value es @Value ("$ {param}"), pero usamos @Value ("$ {param: default}") para la adquisición de parámetros de línea de comando . En la práctica, estos dos métodos se usan comúnmente, y el segundo es pasar el valor predeterminado a través del separador de dos puntos.Cuando el parámetro param no existe o no está configurado en la aplicación, se usará el valor predeterminado especificado.

Tomando el ejemplo actual como ejemplo, si el parámetro projectName no se especifica en el comando de inicio, y el valor predeterminado "desconocido" no se especifica cuando se obtiene @Value, se lanzará una excepción cuando se ejecute el comando de inicio y no se puede iniciar el inicio. Esta es una situación a la que debemos prestar atención cuando usamos @Value.

Con respecto a la configuración de parámetros en el archivo de configuración application.properties es más simple, simplemente configure el valor clave = valor correspondiente en el archivo correspondiente directamente. Por ejemplo, el código fuente de configuración en application.properties en este ejemplo es el siguiente.

# Configuración pública, cualquier entorno comienza a usar el 
servidor 8080.  puerto = 8080  
perfiles de primavera. Active = dev 

Pero en el proceso de práctica, a menudo nos encontramos con situaciones en las que diferentes entornos requieren diferentes archivos de configuración. Si cambia el archivo de configuración o lo vuelve a empaquetar cada vez que cambia el entorno, será más problemático. En este momento, puede usar el Spring Boot proporcionado Función de configuración de perfiles para solucionar el problema. Los tres archivos de configuración de propiedades proporcionados en nuestro ejemplo son para demostrar el uso básico de la configuración del perfil.

En circunstancias normales, se crearán uno o más archivos de configuración de propiedades en el proyecto de acuerdo con el entorno. En circunstancias normales, su formato de nomenclatura correspondiente y funciones relacionadas son las siguientes.

  • * applcation.properties: configuración pública.
  • * application-dev.properties: Configuración del entorno de desarrollo.
  • .application-test.properties: configuración del entorno de prueba.
  • application-prod.properties: configuración del entorno de producción.

Por supuesto, la prueba "dev" y "prod" en el nombre se pueden personalizar, y cuándo se utilizarán estas configuraciones se puede controlar activando el parámetro spring.profiles.active en el archivo de configuración application.properties.

Por ejemplo, realice la configuración pública en applcation.properties y luego active la configuración del entorno especificado mediante la siguiente configuración.

primavera. perfiles.active = prod 

Entre ellos, "prod" se compara con application-prod.properties en el nombre del archivo. Spring Boot obtendrá el archivo de configuración applcation.properties durante el procesamiento y luego usará el valor de perfil especificado "prod" para empalmar y obtener el nombre y la ruta del archivo application-prod.properties. Los pasos y principios específicos de carga y empalme se han analizado en los capítulos anteriores, por lo que puede revisarlos con ejemplos.

En el ejemplo anterior, hemos activado el entorno de configuración de desarrollo y la configuración en application-dev.properties es la siguiente.

# Nombre de usuario del entorno de prueba y 
usuario de la cuenta . Username  = test-admin  
user. Password = test-pwd 

En este momento, accediendo a la solicitud correspondiente, el log correspondiente a la impresión en el método getConfigParams es el siguiente.

Configuración de la aplicación  
Nombre de usuario: test- admin  
Contraseña de configuración de la aplicación: test - pwd 

Si desea activar la configuración del entorno de producción, solo necesita configurar spring.profiles. Active = prod en application.properties.

La adquisición del valor del parámetro @Value y la configuración de parámetros basada en el perfil se han expandido mucho. El uso de @Value también incluye la inyección de cadenas ordinarias, atributos del sistema operativo, resultados de expresión, recursos de archivos, recursos de URL, etc. Puede consultar documentos oficiales Estudio adicional con ejemplos relacionados.

En el uso anterior de @Value, podemos inyectar y configurar un solo atributo, pero si hay muchos atributos de configuración o los atributos de configuración en sí tienen una estructura jerárquica, no es conveniente ni flexible. Por lo tanto, Spring Boo proporciona un método de configuración de tipo seguro.

En ConfigController, inyectamos una clase LoginUserConfig a través de @Resource. Esta clase asocia las propiedades con las propiedades de LoginUserConfig a través de la anotación @ConfigurationProperties para lograr la configuración de seguridad de tipos. El código fuente de LoginUserConfig es el siguiente.

@ Componente @ Configurat ionProperties (prefijo = "usuario")  
clase pública LoginUserConfig {  
nombre de usuario de cadena privada; 
contraseña de cadena privada; 
// 省略 getter / setter 方法 

En el código fuente de la clase LoginUserConfig, la anotación @ConfigurationProperties especifica que las propiedades de configuración con el prefijo user están vinculadas a las propiedades correspondientes de la clase LoginUserConfig durante la instanciación, y la clase es instanciada por @Component.

Aquí, dado que el archivo de configuración especificado es dev, los valores de user.username y user.password en el archivo de configuración dev anterior estarán vinculados a los atributos de nombre de usuario y contraseña de la clase LoginUserConfig, respectivamente. Después de inyectar en ConfigController, se puede obtener el valor de propiedad correspondiente. Además, al ejecutar la solicitud, el registro correspondiente impreso en el método getConfigParams es el siguiente.

  • ConfigurationProperties config Nombre de usuario: prueba - admin
  • ConfigurationProperties config Contraseña: test- pwd

El ejemplo anterior solo demuestra un caso de propiedades vinculantes de @ConfigurationProperties. Cuando Spring Boot vincula la propiedad Environment al bean anotado por @ConfigurationProperties, también se pueden usar algunas reglas sueltas, lo que significa que el nombre de la propiedad Environment y el nombre de la propiedad Bean no necesitan ser precisos partido.

Por ejemplo, si hay un atributo firstName en el objeto Usuario, los siguientes elementos de configuración en el archivo de configuración coincidirán.

  • user. firstName // sintaxis estándar de denominación de casos de camello
  • user. first-name // significa separado por un guion, recomendado para su uso en. properties y. yml files
  • user. first_ name // Subrayado, es un formato opcional para archivos .properties y yml
  • USER_ FIRST _NAME // Mayúsculas, recomendado para variables de entorno del sistema

Al mismo tiempo, la configuración de atributos basada en la seguridad de tipos también se puede combinar con anotaciones @Validated para la verificación de restricciones de atributos, como juzgar si no está vacío, si es el formato correcto de número de teléfono celular (correo electrónico), si es la fecha correcta, etc. Arriba.

Puede intentar expandir con este ejemplo.

Por último, revisemos el contenido clave de los ejemplos de esta sección en su conjunto. Primero, en función del mecanismo de perfil, establecemos los archivos de configuración de varios entornos; luego, a través de la primavera. Perfiles. Configuración activa, especificamos los valores de parámetros específicos de los entornos que se utilizan; luego pasamos Las anotaciones @Value y @ConfigurationProperties unen estas propiedades de configuración a propiedades de clase u objetos Bean; finalmente consígalos y utilícelos en escenarios específicos (este ejemplo es para imprimir).

En la práctica específica, también encontraremos problemas de prioridad. Por ejemplo, si ciertos parámetros se especifican directamente a través de los parámetros de la línea de comando, sobrescribirá los parámetros en el archivo de configuración con el mismo nombre. Por otro ejemplo, si el archivo de configuración de la aplicación se coloca en el mismo directorio del proyecto, su prioridad es mayor que la configuración en el paquete jar. Estos contenidos se tratan en el capítulo principal, los lectores pueden consultar este ejemplo para verificar y estudiar uno por uno.

resumen

Este capítulo se centra en el proceso de transferencia de parámetros y la carga del archivo de configuración en Spring Boot, especialmente el mecanismo de carga basado en perfiles. La carga, la configuración predeterminada, la prioridad de configuración y otras operaciones están ubicadas en la clase ConfigFileApplicationListener Esta clase es digna del tiempo de estudio de los lectores.

La parte de combate real demuestra el uso de algunos principios a través de un ejemplo simple. Puede combinar este ejemplo para verificar y usar más funciones relacionadas.

Finalmente, debido a que este capítulo involucra más código fuente y niveles lógicos más profundos, los diferentes modos de configuración formarán diferentes combinaciones y formarán más escenarios, por lo que se recomienda rastrear cada paso de la operación a través de la depuración durante el proceso de aprendizaje, para ser mejor. Comprende todo el proceso.

 

Supongo que te gusta

Origin blog.csdn.net/weixin_48182198/article/details/109297225
Recomendado
Clasificación