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
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
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]
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
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
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!"
}
}
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"
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"
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"
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"
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)
}
}