Spring Roo, een geavanceerde code generator?
29 June 2009 11:50 · Remco Bos · Java
Wat is Spring Roo? Volgens de makers: “Spring Roo provides interactive, lightweight, user customizable tooling that enables rapid delivery of high performance enterprise Java applications.” En dit is Roo’s mission statement: “Roo’s mission is to fundamentally and sustainably improve Java developer productivity without compromising engineering integrity or flexibility.”
Ik vertaal dit naar “Spring Roo is een slimme code generatie tool voor Spring applicaties” en “Spring Roo belooft de productiviteit van Java ontwikkelaars te verhogen”. Dit was voor mij een reden om Spring Roo eens een keer uit te proberen.
Installatie
Hoewel Spring Roo ook in de SpringSource Tool Suite (STS) geïntegreerd is gebruik ik nu de stand-alone versie en wel van Spring Roo versie 1.0.0M1. Onlangs is versie 1.0.0M2 uitgekomen en deze bevat een hoop verbeteringen. Dus als je aan de slag wilt gaan met Spring Roo, dan zou ik deze laatste versie uitproberen welke hier te downloaden is. Verder zijn er de volgende requirements:
- Java 5 of hoger (ik gebruik Java 6)
- maven 2.0.9 of hoger
Zoals het hoort!
Na uitpakken van de ZIP archive is het handig de path aan te passen. In Windows:
SET PATH=%PATH%;C:\spring-roo-1.0.0.M1\bin
Onder Linux kan een symlink aangemaakt worden:
sudo ln -s ~/spring-roo-1.0.0.M1/bin/roo.sh /usr/bin/roo
De shell
Na het opstarten van Spring Roo wordt er een welkomst scherm getoond.

De eerste commando’s:
- help : toont alle beschikbare commando’s
- hint : voor “step-by-step guidance”

De “hint” geeft goede tips over welke stappen te nemen. De eerste hint geeft bijvoorbeeld aan dat er een project aangemaakt moet worden. Dit is handig, je kan Spring Roo gebruiken zonder de documentatie te lezen!
De webapplicatie

De tweede hint geeft aan dat er een JPA en een database geconfigureerd moet worden. Ik kies voor de H2 database en Hibernate JPA.

Vervolgens kan er een JPA entiteit aangemaakt worden en hieraan kunnen dan velden worden toegevoegd.

De volgende hint geeft aan dat er meerdere mogelijkheden zijn dus nu moet er nagedacht worden. We hebben nog een controller nodig.

En natuurlijk wat tests.

Vervolgens kan je Spring Roo verlaten met het command “exit” of “quit”.
Het resultaat
Als eerste wil ik natuurlijk alle tests draaien in Maven. En daarna wordt de applicatie server gestart, in dit geval de Maven Tomcat plugin.
$ mvn test
$ mvn tomcat:run
Op http://localhost:8080/example/ is de applicatie te bewonderen!

Dit is het scherm om een nieuw record toe te voegen:

En dit is het scherm met de lijst:

Inter-type declarations
Wat Spring Roo onder andere bijzonder maakt is dat het gebruik maakt van AspectJ’s inter-type declarations (ITD’s). Ik had daar nog nooit van gehoord, maar ITD’s zijn een soort van “includes” (ik mag deze term vast niet gebruiken want ik ben deze nog nergens tegengekomen). Het zorgt er voor dat kleine stukjes source code toegevoegd kunnen worden aan een andere source file. Deze kleine stukjes code hebben als extensie .AJ en bevatten 1 aspect van de code, bijvoorbeeld de toString method. Een voorbeeld van een toString ITD:
privileged aspect Country_Roo_ToString { public java.lang.String Country.toString() { StringBuilder sb = new StringBuilder(); sb.append("id: ").append(getId()).append(", "); sb.append("version: ").append(getVersion()).append(", "); sb.append("code: ").append(getCode()).append(", "); sb.append("name: ").append(getName()).append(", "); return sb.toString(); } }
Als de source code gecompileerd wordt, dan worden deze stukjes code netjes samen gevoegd en wordt er 1 class file van gemaakt. Zo is het mogelijk dat een programmeur zijn Java code onderhoud en dat Spring Roo de “includes” onderhoudt (Separation Of Concerns).
Abstract Syntax Tree
Wat verder bijzonder aan Roo is, is dat Spring Roo een Abstract Syntax Tree (AST) van de code maakt. Een AST is een soort van boomstructuur van de source code die een compiler ook maakt. Hierdoor kan Roo veranderingen in sources detecteren en waar nodig ITD’s aanpassen.
Conclusie
Hier volgen nog een keer alle commando’s achter elkaar:
$ mkdir example_project
$ cd example_project
$ roo
$ create project -topLevelPackage com.finalist.example
$ install jpa -provider HIBERNATE -database H2_IN_MEMORY
$ new persistent class jpa -name ~.domain.Country
$ add field string -fieldName code -notNull
$ add field string -fieldName name -notNull
$ new controller automatic -name ~.web.CountriesController
$ new integration test
$ exit
$ mvn test
$ mvn tomcat:run
Dit is niet ingewikkelder dan wanneer je dit in Rails met een scaffold generator zou doen. Spring Roo is inderdaad een mooie code generatie tool. Maar ook op zich is dat niet zo bijzonder, er zijn meer tools die ongeveer hetzelfde kunnen, bijvoorbeeld de open source Java Application Generator (JAG). Wat Spring Roo wel anders maakt is het gebruik van ITD’s en een AST. Deze technieken zorgen er voor dat Spring Roo tot op zekere hoogte “round trip engineering” ondersteund. Hoewel Roo nog niet “af” is, ben ik best wel een beetje onder de indruk van Spring Roo!













Gaaf, dit maakt een project beginnen een stuk gemakkelijker! Ook ben ik benieuwd of de ITD’s zo goed werken dat ze misschien ook in rails/grails worden overgenomen?
Overigens zou ik in linux (net zo min als op ieder platform) zo een symlink aanmaken, maar net zoals je op Windows al aangeeft de bin directory in het path zetten.
Pascal de Vink - June 29, 2009 14:24
@Pascal, ITD’s zoals ze hier uitgelegd worden (includes) is een kern onderdeel van Ruby (modules oftwel mixins). Het is in Ruby triviaal om stukken code in bestaande klassen te gooien en zo extra validaties toe te voegen en nieuwe associaties te definieren aan de hand van de andere “concern” die de module heeft. Ruby biedt ook hookmethods en eval methodes voor maximale flexibiliteit. Heeft niks met het framework Rails te maken
Iain Hecker - June 29, 2009 17:28