Slide 1

Slide 1 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Making Spring Boot Groovier By Graeme Rocher

Slide 2

Slide 2 text

Agenda § Spring Boot & Groovy § Adding a little bit of Groovy § Going nuts with Groovy § Testing with Groovy § Summary / Q & A

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Spring Boot Micro Services • Already expressed more concisely with Groovy 4 @Controller   class  ThisWillActuallyRun  {          @RequestMapping("/")          @ResponseBody          String  home()  {                  "Hello  World!"          }   }

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Adding a powerful
 build system Step 1: Gradle

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Why Gradle? • Builds are not static • Flexibility is key • Simple plugin model • Android compatible • Constantly innovating 8

Slide 9

Slide 9 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Demo: Gradle

Slide 10

Slide 10 text

Gradle • Just add build.gradle! 10 apply  plugin:"groovy"   …   dependencies  {          compile("o.s.b:spring-­‐boot-­‐starter-­‐ web:1.1.6.RELEASE")   }

Slide 11

Slide 11 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Taking Spring Boot
 testing to the next level Step 2: Spock

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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]

Slide 14

Slide 14 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Demo: Spock

Slide 15

Slide 15 text

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  

Slide 16

Slide 16 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Embrace Groovy throughout
 your Spring Boot codebase Step 3: Groovy Everywhere

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Demo: Groovy Controllers

Slide 20

Slide 20 text

Groovy Spring Controllers • Just write your controller in Groovy 20 @RestController   class  ExampleController  {          @RequestMapping("/")          String  hello()  {                  "Hello  World!"          }   }

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Enjoy writing views again
 with Groovy templates Step 4: Groovy Templates

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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"

Slide 25

Slide 25 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Demo: Groovy Templates

Slide 26

Slide 26 text

Groovy Templates • Elegant, readable views expressed in Groovy! 26 ul  {      persons.each  {  person  -­‐>          li  {              a(href:  "/person/$person.id",   "$person.lastName  $person.firstName")          }      }   }

Slide 27

Slide 27 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Next level persistence with GORM Step 5: GORM

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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"

Slide 30

Slide 30 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Demo: GORM for Hibernate

Slide 31

Slide 31 text

GORM for Hibernate • Trivial to create entities 31 import  grails.persistence.*   ! @Entity   class  Person  {          String  firstName          String  lastName   }

Slide 32

Slide 32 text

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()

Slide 33

Slide 33 text

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"

Slide 34

Slide 34 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Demo: GORM for MongoDB

Slide 35

Slide 35 text

GORM for MongoDB • Geospacial querying • GeoJSON models • Full text search • Schemaless domain models • Projections via MongoDB aggregation • Stateless and Stateful modes 35

Slide 36

Slide 36 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Designer friendly views with
 Groovy Server Pages (GSP) Step 6: GSP

Slide 37

Slide 37 text

Groovy Server Pages (GSP) • View rendering engine from Grails • Tag libraries • XSS / Double encoding prevention • Layouts, templates and views 37

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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"

Slide 40

Slide 40 text

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Demo: GSP in Spring Boot

Slide 41

Slide 41 text

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)     }   }

Slide 42

Slide 42 text

GSP • Elegant markup based views 42              

Number  ${num}

    !

${g.dateFormat(format:'dd-­‐MM-­‐yyyy',   date:new  Date())}

Slide 43

Slide 43 text

! Q & A

Slide 44

Slide 44 text

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