V poslední době zažívají skriptovací jazyky boom. Jedním z takových je i Groovy, který funguje ve virtuálním stroji Javy. Přímý přechod z jednoho jazyka na druhý ve firmách zpravidla není možný, naštěstí Spring umožňuje jeho integraci.

Předpokládám, že každý již zaslechl něco o jazyce Groovy. Posledních pár dní jsem ho zkoušel a rozhodně mohu potvrdit, že umožňuje dosáhnout vyšší produktivitu než Java, často také mnohem přehlednější kód. Je možné implementovat Javové třídy v Groovy a naopak, takže můžeme využít všechny dostupné Javové knihovny a přitom celou aplikaci napsat v Groovy. Jedinou velkou nevýhodou je jeho podpora v IDE, IDEA údajně obsahuje kvalitní podporu, ale to se o Eclipse říci nedá a díky tomu je v současnosti rychlejší i pohodlnější psát přímo v Javě.

Vzhledem k tomu, že ve většině firem není z nejrůznějších důvodů možné přejít přímo na Groovy a Grails (což je mimochodem velmi kvalitní framework), je nejlepší cestou jak využít předností tohoto jazyka začlenění do Javových aplikací. Pro začátek to může být například psaní testů v Groovy, ale nabízí se celá řada použití. Například validace formulářů a na tomto příkladu si ukážeme integraci Groovy a Springu při použití Mavenu pro kompilaci.

Nejdříve je nutné nastavit kompilaci pomocí Mavenu. O bezproblémovou kompilaci se nám postará plugin Gmaven a jeho konfigurace v pom.xml je následující:



<build>

<plugins>

<plugin>

<groupid>org.codehaus.groovy.maven</groupid>

<artifactid>gmaven-plugin</artifactid>

<version>1.0-rc-5</version>

<executions>

<execution>

<goals>

<goal>compile</goal>

</goals>

<configuration>

<sources>

<fileset>

<directory>${pom.basedir}/src/main</directory>

<includes>

<include>**/*.groovy</include>

</includes>

</fileset>

</sources>

</configuration>

</execution>

</executions>

</plugin>

</plugins>

</build>


Zde je nutné nastavit cestu ke zdrojovým souborům, pokud je jiná než defaultní src/main/groovy. Dále pokud bychom využívali Groovy i v testech, tak kromě compile musíme uvést i testCompile.

Takže kompilace se úspěšně provede, ale pro samotné spuštění daných tříd je nutné přidat knihovny Groovy.



<dependency>

<groupid>org.codehaus.groovy</groupid>

<artifactid>groovy-all</artifactid>

<version>1.6.3</version>

</dependency>


Nyní již máme funkční podporu Groovy a můžeme přejít na integraci do Springové aplikace. Možnosti jak zpřístupnit Groovy třídu ostatním třídám jsou pomocí XML v applicationContext anebo anotací. Při použití XML přístupu získáme navíc možnost automatického reloadu dané třídy za běhu serveru pokud nastane nějaká změna a to je možnost, kterou nám Java nenabídne. Konfigurace takové třídy (v tomto případě validátoru uživatelského formuláře) v applicationContext.xml je následující:



<beans xmlns="http://www.springframework.org/schema/beans"

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.0.xsd">

<lang :groovy id="userValidator" refresh-check-delay="3000" script-source="classpath:cz/morosystems/web/UserValidator.groovy">

<lang :property name="adressValidator" ref="adressValidator"/>

</lang>


Z příkladu je vidět, že tento skript bude po 3000 milisekundách kontrolován pro změny a případně reloadován. To ale neznamená, že se bude opravdu tak často kontrolovat, ve skutečnosti je tento skript kontrolován pouze při volání jeho metod, takže žádné snížení výkonu celé aplikace nehrozí. Pokud ale nepotřebujeme reloadování souboru, tak stačí tento parametr smazat, protože je tato možnost defaultně vypnutá.

Dále pomocí elementu lang:property můžeme do dané třídy připojit potřebné závislosti (zpravidla třídy business logiky), zde se pro příklad jedná o Javový bean, který se stará o validaci adres, přičemž samotná Groovy třída vypadá následovně.



class UserValidator implements Validator {

def adressValidator

boolean supports(Class clazz) {

User.class == clazz

}

void validate(Object obj, Errors e) {

if(obj?.name == null) {

e.reject(obj.name, "name is required")

}

if(!adressValidator.validate(obj?.adress)) {

e.reject(obj.adress, "adress is invalid")

}

}

}


Danou třídu také můžeme zpřístupnit pomocí anotací. Můžeme využít všech anotací typu @Component, @Service a podobně a samozřejmě také využít ‘dependency injection’ ve formě @Autowired. V podstatě se Spring k takové třídě chová jako k Javové. Stejně tak můžeme v Javových třídách využívat Groovy třídy.

Můžete namítat, proč používat Groovy, když Java zvládne to samé. Ale v některých případech se to opravdu vyplatí a to zejména v komplexních případech kvůli velmi snadné a zároveň mocné práci s řetězci, velmi kvalitní podpoře regulárních výrazů apod.

Více o podpoře skriptovacích jazyků ve Springu najdete zde.