Una tarea común al hacer aplicaciones utilizando spring es leer configuraciones de archivos de tipo .properties, en este ejemplo tomaremos como base el post Spring framework 5 : Uso de @Autowire para listas de objetos y lo modificaremos para leer el valor de las figuras de un archivo properties en lugar de inyectarlo directamente.
Paso 1 Creación del archivo properties
El primer paso será crear el archivo .properties que contendrá los valores de radio, ancho, largo y lado de las figuras que construiremos:
/src/main/resources/areas.properties
circle.radius = 10.0
rectangle.width = 10.0
rectangle.height = 5.0
square.side=10.0
Paso 2 Carga de properties a spring
Una vez que se creó el archivo de propiedades el siguiente paso será cargar esas propiedades a spring para esto crearemos la siguiente clase de configuración:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
/**
* @author raidentrance
*
*/
@Configuration
@PropertySource("classpath:areas.properties")
public class FigurePropertyCopnfiguration {
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Como se puede ver en la anotación @PropertySource se define el archivo .properties del cuál se cargaran las propiedades.
Paso 3 Modificar los beans para utilizar las propiedades
Una vez que se cargaron las propiedades a spring el siguiente paso será modificar nuestras clases, en el ejemplo anterior se utilizó @Value(«10.0») lo cual inyectaba el valor de 10 a la referencia, ahora en lugar de hacer eso haremos un @Value(«${circle.radius:0}») lo cual tomará el valor de la propiedad circle.radius y lo inyectará en nuestra variable, veamos como queda el código:
/**
* @author raidentrance
*
*/
public abstract class Figure {
public abstract double getArea();
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author raidentrance
*
*/
@Component
public class Circle extends Figure {
private double radius;
private static final Logger log = LoggerFactory.getLogger(Circle.class);
public Circle(@Value("${circle.radius:0}") double radius) {
this.radius = radius;
}
@Override
public double getArea() {
log.info("Calculating the are of a circle with radius {}", radius);
return Math.pow(Math.PI * radius, 2);
}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author raidentrance
*
*/
@Component
public class Rectangle extends Figure {
private double width;
private double height;
private static final Logger log = LoggerFactory.getLogger(Rectangle.class);
public Rectangle(@Value("${rectangle.width:0}") double width, @Value("${rectangle.height:0}") double height) {
this.width = width;
this.height = height;
}
@Override
public double getArea() {
log.info("Calculating the are of a rectangle with with {} and height", width, height);
return width * height;
}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author raidentrance
*
*/
@Component
public class Square extends Figure {
private double side;
private static final Logger log = LoggerFactory.getLogger(Square.class);
public Square(@Value("${square.side:0}") double side) {
this.side = side;
}
@Override
public double getArea() {
log.info("Calculating the are of a square with side {}", side);
return Math.pow(side, 2);
}
}
La siguiente sintaxis @Value(«${square.side:0}») significa toma el valor de la propiedad square.side, en caso de que no exista se asignará el valor 0.
El uso de propiedades es muy común debido a que es posible cambiar las configuraciones del código sin tener que re compilar el código.
Para estar al pendiente sobre nuestro contenido nuevo síguenos en nuestras redes sociales https://www.facebook.com/devs4j/ y https://twitter.com/devs4j.
Autor: Alejandro Agapito Bautista
Twitter: @raidentrance
Contacto:raidentrance@gmail.com