Groovy Con Spring
Spring Framework tiene soporte para integrar Groovy como un bean normal más. Además de Groovy, es posible integrar otros lenguajes dinámicos, como JRuby y BeanShell.
Contenido
Ejemplo
En este ejemplo crearemos una interfaz en Java, la implementaremos en Groovy, y la declareremos como un bean más en Spring.
El código
Necesitamos crear 3 archivos:
- La interfaz Mensajero.java
- La implementación en groovy MensajeroImpl.groovy
- La configuración de Spring
La interfaz: Mensajero.java
package com.dosideas.dynlang;
public interface Mensajero {
String decirHola(String nombre);
}
El script de implementación: MensajeroImpl.groovy
package com.dosideas.dynlan.groovy;
import com.dosideas.dynlang.Mensajero
class MensajeroImpl implements Mensajero {
String decirHola(String nombre) { "Hola, " + nombre; }
}
Configuración de Spring: applicacion.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd"> <lang:groovy id="mensajero" script-source="classpath:MensajeroImpl.groovy" />
</beans>
Test
Crearemos un test que ejecute esta lógica. Accedemos directamente al bean mensajero, como si fuera un bean normal.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"/application.xml"
}) public class MensajeroTest {
@Autowired private Mensajero instance;
@Test public void testProcessBooking() throws InterruptedException { String nombre = "Zim"; String result = instance.decirHola(nombre); String expResult = "Hola, " + nombre; assertEquals(expResult, result); }
}
Cambios en caliente
Es posible hacer que el script sea modificado y recompilado "en caliente". Es decir, teniendo a nuestra aplicación corriendo, podemos modificar la lógica del script y la misma comenzará a ejecutarse en caliente, sin necesidad de ningún otro cambio. Esta es sin dudas una de las características más interesantes de usar lenguajes dinámicos con Java.
Para activar esta característica hay que usar el atributo refresh-check-delay al momento de declarar el bean en Spring, el cual le indicará cada cuántos milisegundos debe buscar cambios en el script. Por ejemplo:
<lang:groovy id="messenger" script-source="classpath:Messenger.groovy" refresh-check-delay="1000"/>