Share
Embed
Making Spring Boot Groovier
Talk by Graeme Rocher on embracing Groovy throughout your Spring Boot codebase from SpringOne2GX 2014
graemerocher
September 09, 2014
Transcript
44 slides
-
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Making Spring Boot Groovier By Graeme Rocher -
Agenda § Spring Boot & Groovy § Adding a little
bit of Groovy § Going nuts with Groovy § Testing with Groovy § Summary / Q & A -
Spring Boot & Groovy • Spring Boot not dependent on
Groovy – …but already has Groovy! • Spring Boot Groovy components – Spring Boot CLI – Spring Groovy Templates – Spring Boot Autoconfigure 3 3.0 -
Spring Boot Micro Services • Already expressed more concisely with
Groovy 4 @Controller class ThisWillActuallyRun { @RequestMapping("/") @ResponseBody String home() { "Hello World!" } } -
Adding Groovy to Spring Boot • Starting slow – Gradle
for the build – Spock for unit testing • Digging deeper – Groovy controllers – Groovy templates • Going Groovy all the way! – GORM – GSP 5 3.0 -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Adding a powerful build system Step 1: Gradle -
Gradle • Gradle is… – A flexible powerful build tool
– based on a Groovy DSL – well documented – used by Android – better than Maven ;-) • More at http://www.gradle.org/documentation 7 -
Why Gradle? • Builds are not static • Flexibility is
key • Simple plugin model • Android compatible • Constantly innovating 8 -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Demo: Gradle -
Gradle • Just add build.gradle! 10 apply plugin:"groovy" …
dependencies { compile("o.s.b:spring-‐boot-‐starter-‐ web:1.1.6.RELEASE") } -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Taking Spring Boot testing to the next level Step 2: Spock -
Spock Framework • Spock is… – test & specification framework
– based on a Groovy DSL – well documented – powerful and intuitive – better than JUnit ;-) • See http://docs.spockframework.org/en/latest/ 12 -
Why Spock? • Data driven tests • Integrated mocking /
stubbing • Power assertions 13 def x = [1, 2, 3] assert x == [3, 2, 1] ! Caught: Assertion failed: assert x == [3, 2, 1] | | | false [1, 2, 3] -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Demo: Spock -
Spock • Add spock as a test scoped dependency !
! ! • Then just extend spock.lang.Specification 15 testCompile( "[..]:spock-‐core:0.7-‐groovy-‐2.0" ) class FooSpec extends spock.lang.Specification -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Embrace Groovy throughout your Spring Boot codebase Step 3: Groovy Everywhere -
Groovy Everywhere • Groovy & Java can be seamlessly mixed
• With @CompileStatic there is no longer a performance cost • Introducing Groovy into your codebase is easier than ever! 17 3.0 -
Why Groovy? • Get Java 8 lambdas but deployable to
any JVM (1.5+) • Easy to learn for Java developers • Static or dynamic compilation • Android support • Extensive Groovy SDK 18 3.0 -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Demo: Groovy Controllers -
Groovy Spring Controllers • Just write your controller in Groovy
20 @RestController class ExampleController { @RequestMapping("/") String hello() { "Hello World!" } } -
Groovy Spring Controllers • Add @CompileStatic if you want type
checking 21 @RestController @CompileStatic class ExampleController { @RequestMapping("/") String hello() { "Hello World!" } } -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Enjoy writing views again with Groovy templates Step 4: Groovy Templates -
Groovy Templates • MarkupTemplateEngine introduced in Groovy 2.3 • Support
for type safe views, layouts etc. • Markup builder style and native Spring Boot support 23 3.0 -
Groovy Templates • Add groovy-templates as a dependency ! !
! ! • Then add Groovy templates with file extension .tpl to src/main/templates/views ! • Layouts go into src/main/templates/layouts 24 compile "org.codehaus.groovy:groovy-‐ templates:2.3.6" -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Demo: Groovy Templates -
Groovy Templates • Elegant, readable views expressed in Groovy! 26
ul { persons.each { person -‐> li { a(href: "/person/$person.id", "$person.lastName $person.firstName") } } } -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Next level persistence with GORM Step 5: GORM -
GORM • Powerful multi-datastore query layer • Dynamic finders, criteria,
and persistence methods • Integrated validation • Automatic mapping of entities to underlying datastore • Easy access to native APIs 28 -
GORM for Hibernate • Add gorm-hibernate4-spring-boot as a dependency !
! ! ! • Then add persistent entities that are annotated with grails.persistence.Entity 29 compile "org.grails:gorm-‐hibernate4-‐ spring-‐boot:1.0.0.RELEASE" -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Demo: GORM for Hibernate -
GORM for Hibernate • Trivial to create entities 31 import
grails.persistence.* ! @Entity class Person { String firstName String lastName } -
GORM for Hibernate • Powerful query composition with detached criteria
32 def employees = Employee.where { region.continent in ['APAC', "EMEA"] }.id() ! def results = Sale.where { employee in employees && total > 50000 }.employee.list() -
GORM for MongoDB • Add gorm-mongodb-spring-boot as a dependency !
! ! ! • Then add persistent entities that are annotated with grails.persistence.Entity 33 compile "org.grails:gorm-‐mongodb-‐spring-‐ boot:1.1.0.RELEASE" -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Demo: GORM for MongoDB -
GORM for MongoDB • Geospacial querying • GeoJSON models •
Full text search • Schemaless domain models • Projections via MongoDB aggregation • Stateless and Stateful modes 35 -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Designer friendly views with Groovy Server Pages (GSP) Step 6: GSP -
Groovy Server Pages (GSP) • View rendering engine from Grails
• Tag libraries • XSS / Double encoding prevention • Layouts, templates and views 37 -
GSP vs. Groovy Templates • GSP uses standard XML/HTML markup
• More designer friendly • Mature, used in Grails for years • Development and precompiled modes • XSS prevention • Can use existing JSP or GSP tag libraries 38 -
GSP in Spring Boot • Add grails-gsp-spring-boot as a dependency
! ! ! ! • Then add GSP templates with file extension .gsp to src/ main/resources/templates 39 compile "org.grails:grails-‐gsp-‐spring-‐ boot:1.0.0.RC1" -
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Demo: GSP in Spring Boot -
GSP • Easy definition of tag libraries in Groovy code
41 @TagLib class FormatTagLib { def dateFormat = { attrs, body -‐> out << new SimpleDateFormat(attrs.format) .format(attrs.date) } } -
GSP • Elegant markup based views 42
<g:each in="${[1,2,3]}" var="num"> <p>Number ${num}</p> </g:each> ! <p>${g.dateFormat(format:'dd-‐MM-‐yyyy', date:new Date())}</p> -
Stay Connected. ! ! ! ! Web: grails.org StackOverflow: http://stackoverflow.com/tags/grails
Twitter: http://twitter.com/grailsframework LinkedIn: http://linkedin.com/groups/Grails-User-Group-39757 Google+: https://plus.google.com/communities/ 109558563916416343008