Spring Boot proporciona varias maneras para enlazar propiedades personalizadas en una aplicación, a continuación exploraremos algunas de ellas.
Supongamos que en el archivo application.properties tenemos las siguientes entradas:

custom.user.name = Peter
custom.user.age = 78
custom.user.email = peter@test.com

Una manera de enlazar estos valores en nuestra aplicación es usando el decorador @Value(“$propiedad”)

@Component
public class PropiedadesPersonalizadas {
	
	@Value("${custom.user.name}")
	private String name;
	
	@Value("${custom.user.age}")
	private String age;
	
	@Value("${custom.user.email}")
	private String email;
	
	//getters & setters
	
}

Aunque el decorador @Value(“$propiedad”) es una forma valida de enlazar propiedades, resulta tedioso de usar cuando tenemos muchas propiedades que enlazar. Pensando en esto Spring Boot provee otro enfoque para el manejo de propiedades, mediante el uso de los decoradores @Configuration y @ConfigurationProperties.

Pero antes de usar estos decoradores vamos a agregar al proyecto la dependencia spring-boot-configuration-processor.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

Esta librería genera metadatos sobre las clases decoradas con @ConfigurationProperties, los cuales son usados por entornos de desarrollo como Eclipse, IntelliJ o NetBeans, para propósitos de auto-completado de las propiedades cuando se edita el archivo application.properties (o.yml).

Para comprender el uso de @Configuration@ConfigurationProperties vamos a suponer que tenemos los siguientes parámetros personalizados en nuestro archivo application.properties

#DATOS GENERALES
codeApp=121314
description=Test App 

#DATOS AGRUPADOS
#Configuración de correo
e-mail.port=25
e-mail.host=test@test.com
e-mail.user=test
e-mail.password=test

Ahora vamos a suponer que tenemos la necesidad de acceder a las propiedades marcadas como #DATOS GENERALES. ¿Cómo podemos hacer esto sin usar @Value(…)?. Primero Vamos a crear una clase encapsulando los atributos codeApp y description, luego la decoramos con @Configuration y @ConfigurationProperties.

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties
public class PropiedadesGlobales {
	
	private String codeApp;
	private String description;
	
	//getters & setters...
}

El decorador @Configuration lo usamos para poder inyectar la clase con @Autowired ya que internamente posee las características de @Component, y a demás, aunque no alcance de este post, lo podemos usar para crear métodos decorados con @Bean , los cuales generan objetos cuyo ciclo de vida y contexto es manejado por el contenedor IoC de Spring. El decorador @ConfigurationProperties lo usamos para extraer propiedades de nuestro archivo applications.properties. Y eso es todo, ahora podemos tener acceso a las propiedades generales inyectando la clase donde deseemos, inclusive en una clase de pruebas, como se muestra a continuación:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.example.demo.config.PropiedadesGlobales;

@SpringBootTest
class DemoApplicationTests {

	@Autowired
	PropiedadesGlobales propiedadesGlobales;
	
	@Test
	void contextLoads() {
		System.out.println(propiedadesGlobales.codeApp);
		
	}

}

Ahora supongamos que queremos acceder las propiedades agrupadas por un prefijo, como es el caso de las propiedades e-mail de nuestro archivo application.properties definido arriba. Para hacer esto creamos la clase PropiedadesCorreo encapsulando en ella las propiedades de e-mail, luego la decoramos con @Configuration y con @ConfigurationProperties pero a este último le añadimos el campo prefix igualándolo al valor e-mail.

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;


@Configuration
@ConfigurationProperties(prefix = "e-mail")
public class PropiedadesCorreo {

	private String port;
	private String host;
	private String user;
	private String password;
	
	//getters & setters...
	
}

De esta manera podemos tener acceso a nuestras propiedades personalizadas inyectando la clase donde deseemos. A medida que fluye el desarrollo es muy posible que nuestro archivo application.properties crezca. En este caso es conveniente crear nuestros propios archivos de propiedades separados del application.properties. Siguiendo con nuestro ejemplo, supongamos que deseamos separar el grupo de propiedades e-mail , para ello, primero creamos un archivo llamado email.properties, y es este, emplazamos las propiedades de correo:

Y luego decoramos nuestra clase con @PropertySource(«classpath:email.properties”). De esta manera le decimos a Spring que busque en el classpath del proyecto el archivo email.properties, y que de este obtenga las propiedades.

import org.springframework.context.annotation.PropertySource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@PropertySource("classpath:email.properties")
@ConfigurationProperties(prefix = "e-mail")
public class PropiedadesCorreo {

	private String port;
	private String host;
	private String user;
	private String password;
	
	//getters & setters...
	
}

Hasta aquí, podemos decir, que aprendimos como enlazar propiedades personalizadas con ayuda del decorador @Value, vimos como optimizar este proceso con @ConfigurationProperties, y finalmente aprendimos también como enlazar una archivo de propiedades diferente al application.properties con el decorador @PropertySource.

Giovanny Rey Cediel
Última modificación: mayo 27, 2020

Comentarios

Comenta o responde a los comentarios

Tu dirección de correo no será publicada.

seventy two ÷ nine =