SpEL soporta una gran cantidad de tipos de expresiones, este artículo enumera los más básicos y muestra algunos ejemplos sencillos para cada uno de ellos.

Literales

Los literales son las expresiones más sencillas que pueden utilizarse. Constantes que representan cadenas de texto, valores numéricos, valores lógicos, … utilizando las reglas habituales:

#{ '¡Hola mundo cruel!' }
#{ '3.14159' }
#{ '0xff' }

Propiedades

Dado un objeto, se sigue la nomenclatura de punto para acceder a sus propiedades:

#{ libro.titulo }
#{ continente.pais.ciudad }

Colecciones

Los objetos dentro de una colección se pueden referenciar por su índice, o por su clave en el caso de los arrays asociativos:

#{ biblioteca.libros[0] }
#{ paises['es'].nombre }

Listas

Se pueden construir listas embebidas dentro de las propias expresiones utilizando la notación de llaves:

#{ {1, 1, 2, 3, 5, 8, 13} }
#{ {1, 3, 5}, {2, 4, 6} }
#{ {'Gaspar', 'Melchor', 'Baltasar'} }

Arrays

Se pueden construir matrices embebidas dentro de las propias expresiones invocando el constructor de Java:

#{ new int[100] }
#{ new int[4]{11, 21, 31, 41} }

Métodos

Dado un objeto, se sigue la nomenclatura de punto para invocar sus métodos:

#{ '¡Viva '.concat(' Las Vegas!') }
#{ {1, 2, 3}.size() }

Operadores

Se pueden utilizar los operadores relacionales habituales para realizar comparaciones:

#{ 1 == 1 }
#{ 'madre' > 'hijo' }

Se pueden utilizar los operadores lógicos habituales para evaluar condiciones:

#{ true and false }
#{ !('infinito'.length() == 0) }

Y se pueden utilizar operadores aritméticos habituales:

#{ 1 + 1 }
#{ 7 % 5 }

Asignaciones

Aunque no muy habitual, se pueden realizar asignaciones directamente. A este punto hay que recordar la existencia del objeto root contextual sobre el que aplica una expresión:

#{ nombre = 'Cervantes' }
#{ alpha = 47 }

Tipos

El operador especial T(type) se puede utilizar para obtener una referencia a una clase, e invocar sus métodos estáticos por ejemplo:

#{ T(java.lang.String).valueOf(47) }
#{ T(java.lang.Math).random() * 100 }

Constructores

Se pueden construir objetos utilizando new y el nombre completo de la clase que se quiere instanciar, excepto para los tipos básicos que son directamente reconocidos:

#{ new int[4] }
#{ new com.empresa.Libro('Fortunata y Jacinta') }