Spring Expression Language (SpEL)

Spring Expression Language (SpEL) es un lenguaje que nos permite inyectar valores a las propiedades de los beans en tiempo de ejecución, se puede usar tanto en XML como en Java, adicionalmente también podemos usar SpEL en las vistas generadas con el motor de plantillas Thymeleaf, por lo que este lenguaje de expresiones se convierte en una herramienta poderosa a la hora de crear nuestras aplicaciones usando Spring Framework.

Spring Expression Lenguage (SpEL)

El SpEL es parte del Core Container de Spring y fue introducido al framework en la versión Spring 3.

Usando SpEL en configuración XML

Para utilizar las expresiones debemos incluirlas dentro de #{...}, en el ejemplo vemos dos beans, el primero simplemente define valores constantes para las respectivas propiedades, en el segundo ya podemos apreciar el poder de este lenguaje, vemos como podemos establecer los valores para las propiedades de manera dinámica.

<bean id="bean_two" class="carmelo.spring.TestBean">
    <property name="valor" value="#{2.15}" />
    <property name="nombre" value="#{'tutor de programacion'}" />
</bean>

<bean id="bean_one" class="carmelo.spring.TestBean">
    <property name="valor" value="#{T(java.lang.Math).PI}" />
    <property name="nombre" value="#{bean_two.getNombre().toUpperCase()}" />
</bean>

La expresión #{T(java.lang.Math).PI} accede a la constante PI de la clase java.lang.Math y la asigna a la propiedad indicada, podemos usar la sintaxis T(full.class.name).member para acceder a cualquier miembro de una clase, siempre que estos sean accesibles.

La segunda expresión #{bean_two.getNombre().toUpperCase()} la utilizamos para hacer referencia al primer bean, obtenemos la propiedad nombre del mismo y utilizamos el método toUpperCase() para convertirlo a mayúsculas.

Si deseas información más detallada sobre la configuración XML de Spring visita: Spring Configuración XML, el resultado:

TestBean{valor=3.141592653589793, nombre=TUTOR DE PROGRAMACION}

Debemos saber que cuando accedimos a la propiedad nombre del bean lo hicimos usando una llamada a un método, pero también podemos hacerlo indicando solo el nombre de la propiedad deseada, ejemplo: #{bean_two.nombre}.

Usar SpEL en código Java

Como mencionamos previamente también podemos usar el lenguaje en código Java, para ello usaremos la anotación @Value("#{...}"), la sintaxis de las expresiones es igual a la que usamos en la versión XML.

SpEL posee soporte para las operaciones aritméticas usando los operadores: +, –, /, *, %, ^, el operador + también puede ser usado para concatenar cadenas de texto, veamos algunos ejemplos:

@Configuration
public class Beans {

    @Value("#{10 + 20}")
    public Integer n1;

    @Value("#{(20 / 4) + 5}")
    public Integer n2;
    
    @Bean("printer")
    public String printer(){
        return "N1: " + n1 + ", N2: " + n2;
    }
}

Los operadores lógicos también están admitidos, tenemos los operadores booleanos: (!, not, and, or) y los operadores de comparación: (eq, ne, lt, le, gt, ge) estos corresponden a los símbolos: (==, !=, <, <=, >, >=), podemos usar uno u otro, veamos algunos ejemplos:

@Value("#{10 > 8 and 5 < 10}")
public Boolean b1;

@Value("#{10 eq 10}")
public Boolean b2;

Es posible inyectar un valor comprobando una condición, la primera posibilidad es usar el operador ternario ?:

@Bean
public Integer edad() { return 15; }

@Value("#{ edad >= 18 ? 'Mayor' : 'Menor'}")
public String s1;

El operador Elvis también se puede utilizar, este nos permite asignar un valor por defecto a una propiedad si la condición es nula, nuestro ejemplo comprueba si el nombre es nulo, de ser así, le asignará el valor por defecto que hayamos indicado, de lo contrario asignará el valor devuelto por nombre.

@Bean
public String nombre() { return null; }

@Value("#{ nombre ?: 'default' }")
private String elvis;

Por último veremos como podemos comprobar si un dato cumple con el patrón establecido por una expresión regular.

@Value("#{ 'A-12345' matches '[A-Z]-[0-9]+' }")
private Boolean valid;

@Value("#{ 'AX-1234' matches '[A-Z]-[0-9]+' }")
private Boolean invalid;

Para cumplir con la expresión regular requerimos que el texto inicie con una letra seguido del símbolo: –, y luego uno o más números.

Acceder a variables de entorno y propiedades de sistema

Usando la sintaxis systemEnvironment[] podemos acceder a variable de entorno, debemos indicar el nombre de la variable a la que deseamos tener acceso, por ejemplo: JAVA_HOME guarda la carpeta de instalación de Java, de igual modo usando la sintaxis systemProperties[] consultamos las propiedades de sistema, por ejemplo, la versión del JDK que estemos ejecutando.

@Value("#{systemEnvironment[JAVA_HOME]}")
private String java;

@Value("#{systemProperties['java.version']}")
private String version;

La salida en la ventana es:

JAVA_HOME: C:\Program Files\Java\jdk1.8.0_74
JAVA_VERSION: 1.8.0_74

Esto es solo una pequeña parte de las posibilidades que tenemos con SpEL, en próximos tutoriales seguiremos explorando este lenguaje, de momento es todo por ahora, hasta la próxima.  

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Detección de figuras geométricas

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV