Obtener valores de configuración antes iniciar una aplicación con Spring Boot

Escrito por el .
java planeta-codigo
Enlace permanente Comentarios

El mecanismo de configuración de Spring Boot es muy flexible y por otro lado Spring Boot proporciona varias formas de extensión. En el proceso de inicialización de la aplicación Spring Boot permite recibir eventos y realizar las acciones que se deseen. Uno de estos eventos es ApplicationEnvironmentPreparedEvent antes de inicializar el contexto y crear los beans del contenedor de dependencias, cyando se lanza este evento es posible acceder a las propiedades de configuración.

Spring

Los archivos de configuración de las aplicaciones permiten cambiar su comportamiento sin tener que modificar el código fuente ni tener que generar un artefacto de despliegue. Con diferentes archivos de configuración la aplicación es la misma pero su comportamiento diferente por ejemplo según el entorno en el que se despliegue, en la propia máquina de desarrollo, producción u otro entorno.

Los archivos de configuración son una colección de propiedades y valores. El formato del archivo de configuración también variable puede ser un archivo properties u otros formatos como XML, un formato más legible como YAML u otro tipo de formato. En los archivos de configuración se guardan las variables y los valores y las aplicaciones cuando necesitan el valor de una propiedad lo solicitan a través del nombre de la variable.

Spring Boot proporciona un soporte para archivos de configuración muy flexible que permite obtener los valores de las propiedades de diferentes formas y con un orden de preferencia que incluye archivos de configuración externos y variables de entorno. Uno de los formatos que soporta es YAML que es legible aún con su defecto de ser propenso a errores debido a que su sintaxis se basa en una tabulación correcta.

Cuando la aplicación de Spring Boot se inicia se cargan las propiedades de configuración y posteriormente se crean los servicios del contenedor de dependencias con los valores de las propiedades de configuración, pero en necesidades muy concretas es necesario acceder al valor de las propiedades de configuración antes incluso de que la aplicación de Spring Boot empiece a crear los beans.

Obtener valores de configuración antes de la inicialización del contexto de Spring Boot

En caso de necesitar obtener valores de configuración Spring Boot proporciona la interfaz ApplicationListener para recibir el evento ApplicationEnvironmentPreparedEvent que se invoca antes de iniciar la aplicación de Spring Boot. Se recibe una referencia del evento a través de la cual es posible acceder a los valores de configuración.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package io.github.picodotdev.blogbitix.springinjectionpoint;

import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;

public class DefaultApplicationListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {

  @Override
  public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    System.out.printf("Property (app.property): %s%n", event.getEnvironment().getProperty("app.property"));
  }
}
DefaultApplicationListener.java
1
2
app:
  property: "value"
application.yml

Al iniciar la aplicación antes incluso de que aparezca el mensaje del banner de Spring Boot sale la traza con el valor de la propiedad de configuración.

1
2
3
4
5
6
7
8
9
Property (app.property): value

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.6)
System.out

En la documentación sobre eventos y listeners de Spring Boot están todos los eventos a los que una aplicación puede suscribirse junto con la descripción de cuando se lanzan. En la misma documentación se especifica que como alguno de los eventos se lanzan incluso antes de iniciarse el contexto de Spring Boot los listeners no pueden definirse como beans del contenedor de dependencias.

Para registrar los listeners hay que usar el método SpringApplication.addListeners al crear y arrancar la aplicación de Spring Boot.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package io.github.picodotdev.blogbitix.springinjectionpoint;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class Main implements CommandLineRunner {

    @Autowired
    private Service service;

    @Override
    public void run(String... args) throws Exception {
        service.echo();
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(Main.class)
                .listeners(new DefaultApplicationListener())
                .application()
                .run();
    }
}
Main.java
Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run


Comparte el artículo: