Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Making Spring Boot Groovier

graemerocher
September 09, 2014

Making Spring Boot Groovier

Talk by Graeme Rocher on embracing Groovy throughout your Spring Boot codebase from SpringOne2GX 2014

graemerocher

September 09, 2014
Tweet

More Decks by graemerocher

Other Decks in Programming

Transcript

  1. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Making Spring Boot Groovier By Graeme Rocher
  2. Agenda § Spring Boot & Groovy § Adding a little

    bit of Groovy § Going nuts with Groovy § Testing with Groovy § Summary / Q & A
  3. 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
  4. Spring Boot Micro Services • Already expressed more concisely with

    Groovy 4 @Controller   class  ThisWillActuallyRun  {          @RequestMapping("/")          @ResponseBody          String  home()  {                  "Hello  World!"          }   }
  5. 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
  6. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Adding a powerful
 build system Step 1: Gradle
  7. 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
  8. Why Gradle? • Builds are not static • Flexibility is

    key • Simple plugin model • Android compatible • Constantly innovating 8
  9. Gradle • Just add build.gradle! 10 apply  plugin:"groovy"   …

      dependencies  {          compile("o.s.b:spring-­‐boot-­‐starter-­‐ web:1.1.6.RELEASE")   }
  10. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Taking Spring Boot
 testing to the next level Step 2: Spock
  11. 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
  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]
  13. 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  
  14. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Embrace Groovy throughout
 your Spring Boot codebase Step 3: Groovy Everywhere
  15. 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
  16. 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
  17. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Demo: Groovy Controllers
  18. Groovy Spring Controllers • Just write your controller in Groovy

    20 @RestController   class  ExampleController  {          @RequestMapping("/")          String  hello()  {                  "Hello  World!"          }   }
  19. Groovy Spring Controllers • Add @CompileStatic if you want type

    checking 21 @RestController   @CompileStatic   class  ExampleController  {          @RequestMapping("/")          String  hello()  {                  "Hello  World!"          }   }
  20. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Enjoy writing views again
 with Groovy templates Step 4: Groovy Templates
  21. 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
  22. 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"
  23. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Demo: Groovy Templates
  24. Groovy Templates • Elegant, readable views expressed in Groovy! 26

    ul  {      persons.each  {  person  -­‐>          li  {              a(href:  "/person/$person.id",   "$person.lastName  $person.firstName")          }      }   }
  25. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Next level persistence with GORM Step 5: GORM
  26. 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
  27. 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"
  28. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Demo: GORM for Hibernate
  29. GORM for Hibernate • Trivial to create entities 31 import

     grails.persistence.*   ! @Entity   class  Person  {          String  firstName          String  lastName   }
  30. 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()
  31. 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"
  32. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Demo: GORM for MongoDB
  33. GORM for MongoDB • Geospacial querying • GeoJSON models •

    Full text search • Schemaless domain models • Projections via MongoDB aggregation • Stateless and Stateful modes 35
  34. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Designer friendly views with
 Groovy Server Pages (GSP) Step 6: GSP
  35. Groovy Server Pages (GSP) • View rendering engine from Grails

    • Tag libraries • XSS / Double encoding prevention • Layouts, templates and views 37
  36. 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
  37. 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"
  38. © 2014 SpringOne 2GX. All rights reserved. Do not distribute

    without permission. Demo: GSP in Spring Boot
  39. 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)     }   }
  40. 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>
  41. 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