Prefacio
Para configurar de manera flexible en proyectos, a menudo usamos archivos de configuración. Los archivos de configuración comunes son como XML y propiedades. SpringBoot permite el uso de propiedades y archivos YAML como configuraciones externas. El soporte del compilador para el lenguaje YAML no es lo suficientemente bueno ahora, y el archivo de propiedades todavía se usa como configuración externa.
Antes de que saliera la configuración de Spring Cloud, implementé el centro de configuración basado en ZK y eliminé el archivo de configuración de propiedades locales. El principio es muy simple, pero acabo de sobrecargar mergeProperties() de PropertyPlaceHolderConfigurer:
/*** Sobrecarga la implementación de la propiedad de fusión* Primera carga de propiedades del archivo, luego fusione en las propiedades leídas por el Centro de configuración ZK** @return Merged Propiedad Collection* @throws IOException Exception*/ @overRideProtected Properties MergeProperties () lanza IOException {Properties Result = New Properties ();; // Cargue la configuración de las propiedades de la clase principal MergeProperties = super.mergeProperties (); resultado.putall (MergeProperties); // Cargue la configuración leída del mapa zk <string, string> configs = loadzkconfigs (); result.putall (configs); Resultado de retorno;} Esta implementación es bastante fácil de usar en proyectos de primavera, pero recientemente algunos proyectos de bola de primavera encontraron que esta implementación de marcador de posición y @ConfigurationProperties(prefix = "xxx") no pueden funcionar bien.
Es decir, las propiedades no se resuelven, y puede leerlas de la manera @Value, pero si hay muchas propiedades para @Value, todavía es bastante engorroso. Todavía tiendo a usar el prefijo de @ConfigurationProperties. Así que miré la documentación del arranque de primavera y descubrí que PropertySource
orden:
* DevTools Global Settings Propiedades en su directorio de inicio (~/.spring-boot-devtools.properties cuando DevTools está activo).
* @TestPropertySource anotaciones en sus pruebas.
* @Springboottest#Atributo de anotación de propiedades en sus pruebas.
* Argumentos de línea de comandos.
* Propiedades de Spring_Application_Json (JSON Inline integrado en una variable de entorno o propiedad del sistema)
* Parámetros de ServletCig Init.
* ServletContext Init Parámetros.
* JNDI ATRIBUTOS DE JAVA: COMP/Env.
* Propiedades del sistema Java (System.getProperties ()).
* Variables de entorno del sistema operativo.
* Un randomvaluepropertySource que solo tiene propiedades en aleatorias*.
* Propiedades de aplicación específicas de perfil fuera de su frasco empaquetado (aplicación- {perfil} .properties y variantes Yaml)
* Propiedades de aplicación específicas de perfil empaquetadas dentro de su jar (aplicación- {perfil} .properties y variantes Yaml)
* Propiedades de la aplicación fuera de su frasco empaquetado (Application.Properties y YAML Variants).
* Propiedades de aplicación empaquetadas dentro de su jar (aplicación. Propiedades y variantes Yaml).
* @PropertySource anotaciones en sus clases de @Configuration.
* Propiedades predeterminadas (especificadas usando SpringApplication.SetDefaultProperties).
No es difícil encontrar que pueda verificar las propiedades en las propiedades del sistema Java. Es decir, simplemente escriba las propiedades leídas por MergeProperties en accesorios del sistema Java, mire el código fuente y encuentre un punto de entrada.
/*** Implementación de la propiedad de procesamiento de sobrecarga* Según las opciones, decida si escribir los accesorios fusionados a las propiedades del sistema. El arranque de la primavera requiere * * @param beanFactoryToprocess * @param Props Propiedades fusionadas * @throws beansexception */ @overrideprotected void processproperties (configurureableBeanFactory BeanFactoryToProcess, props) lanza beansexception {// lógica original super.processproperties (beanFactoryToProCess, props props); // Escribir a la propiedad del sistema if (writePropstoSystem) {// Escriba todas las propiedades en el sistema para la enumeración de arranque de primavera <?> Propertynames = props.propertynames (); while (Propertynames.hasmoreElements ()) {String Propertyyname = (String) Propertynames.NextElement (); String PropertyValue = props.getProperty (PropertyName); System.SetProperty (PropertyName, PropertyValue); }}} Para evitar un impacto excesivo, se establece un interruptor para escribir propiedades del sistema. Si se trata de un proyecto de arranque de primavera, actúe, para minimizar el impacto en los proyectos de arranque en línea que no son de primavera. Luego, @ConfigurationProperties of Spring Boot leen perfectamente las propiedades;
Consulte el código específico: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
@OverridePublic Object PostProcessBeForeInitialization (Object Bean, String BeanName) lanza BeanSexception {ConfigurationProperties annotation = annotationUtils .Findannotation (bean.getClass (), ConfigurationProperties.class); if (anotation! = null) {posprocessbeForeforeinitialization (frijoles, beanName, anotation); } anotación = this.beans.findFactoryAnnotation (BeanName, ConfigurationProperties.Class); if (anotation! = null) {posprocessbeForeforeinitialization (frijoles, beanName, anotation); } return bean;}Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.