SlideShare a Scribd company logo
Spring Framework 5.2:
Core Container Revisited
Juergen Hoeller
October 7–10, 2019
Austin Convention Center
Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Core API Revision
Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Java 8+ Baseline in Spring Framework 5
Entire framework codebase is Java 8 based
• internal use of lambda expressions and collection streams
• efficient introspection of constructor/method parameter signatures
Framework APIs can expose Java 8 API types
• Executable, CompletableFuture, Instant, Duration, Stream
• java.util.function interfaces: Supplier, Consumer, Predicate
Framework interfaces make use of Java 8 default methods
• existing methods with default implementations for convenience
• new methods with default implementations for backwards compatibility
3

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Nullability
Comprehensive nullability declarations across the codebase
• non-null by default + individual @Nullable declarations
The Java effect: nullability validation in IntelliJ IDEA and Eclipse
• allowing applications to validate their own interaction with Spring APIs
The Kotlin effect: straightforward assignments to non-null variables
• Kotlin compiler only allows such assignments for APIs with clear nullability
Currently directly supported + JSR-305 meta-annotations
• collaboration on common code analysis annotations with Google & JetBrains
4

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Programmatic Lookup via ObjectProvider
@Autowired ObjectProvider<Foo> foo
ObjectProvider<Foo> foo = ctx.getBeanProvider(Foo.class)
ObjectProvider methods with nullability declarations
● @Nullable T getIfAvailable()
● @Nullable T getIfUnique()
Overloaded variants with java.util.function callbacks (new in 5.0)
● T getIfAvailable(Supplier<T> defaultSupplier)
● void ifAvailable(Consumer<T> dependencyConsumer)
● T getIfUnique(Supplier<T> defaultSupplier)
● void ifUnique(Consumer<T> dependencyConsumer)
5

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bean Stream Retrieval via ObjectProvider
@Autowired ObjectProvider<Foo> foo
ObjectProvider<Foo> foo = ctx.getBeanProvider(Foo.class)
Individual object retrieval (primary/unique)
● T getObject()
● @Nullable T getIfAvailable()
● @Nullable T getIfUnique()
Iteration and stream retrieval (new in 5.1)
● Iterator<T> iterator()
● Stream<T> stream()
● Stream<T> orderedStream()
6

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Programmatic Bean Registration with Java 8
// Starting point may also be AnnotationConfigApplicationContext
GenericApplicationContext ctx = new GenericApplicationContext();
ctx.registerBean(Foo.class);
ctx.registerBean(Bar.class,
() -> new Bar(ctx.getBean(Foo.class)));
// Or alternatively with some bean definition customizing
GenericApplicationContext ctx = new GenericApplicationContext();
ctx.registerBean(Foo.class, Foo::new);
ctx.registerBean(Bar.class,
() -> new Bar(ctx.getBeanProvider(Foo.class)),
bd -> bd.setLazyInit(true));
7

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Programmatic Bean Registration with Kotlin
// Java-style usage of Spring's Kotlin extensions
val ctx = GenericApplicationContext()
ctx.registerBean(Foo::class)
ctx.registerBean { Bar(it.getBean(Foo::class)) }
// Gradle-style usage of Spring's Kotlin extensions
val ctx = GenericApplicationContext {
registerBean<Foo>()
registerBean { Bar(it.getBean<Foo>()) }
}
8

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Performance Tuning
Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Component Scanning
Classpath scanning on startup may be slow
• <context:component-scan> or @ComponentScan
• file system traversal of all packages within the specified base packages
The common solution: narrow your base packages
• Spring only searches within the specified roots in the classpath
• alternatively: fully enumerate your component classes (no scanning at all)
New variant since 5.0: a build-time annotation processor
• spring-context-indexer generates META-INF/spring.components per jar
• automatically used at runtime for compatible component-scan declarations
1
0

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Annotation Processing
New MergedAnnotations API in 5.2
• sophisticated introspection of meta-annotation arrangements
• backing Spring's common AnnotationUtils and AnnotatedElementUtils now
Enabling a custom annotation registry
• registering presence/absence of certain annotations per component class
• bean post-processors avoid unnecessary introspection of methods/fields
Integration with indexers (e.g. Jandex) ?
• adapting index metadata to Spring's annotation lookup facilities on startup
• however, prototyping efforts did not lead to significant gains yet
11

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Component Model Implications
Most efficient: purely programmatic functional registration
• no component scanning, no reflective factory methods
• no annotation-config setup (no annotation post-processors)
@Configuration(proxyBeanMethods=false) in 5.2
• same effect: @Bean methods on non-@Configuration classes
• avoiding runtime generation of CGLIB subclasses
• drawback: no interception of cross-@Bean method calls
Prefer interface-based proxies over CGLIB proxies
• again: avoiding runtime generation of CGLIB subclasses
1
2

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Third-Party Libraries
Persistence provider bootstrapping
• consider specifying an async bootstrap executor for JPA / Hibernate
• Spring Data+Boot: spring.data.jpa.repositories.bootstrap-mode=deferred
Hibernate ORM 5.4.5
• internal performance improvements, lower memory consumption
• optional: bytecode enhancement (also for lazy loading), Jandex integration
Jackson 2.9 / 2.10
• Spring Framework 5.2 requires Jackson 2.9.7+, supports Jackson 2.10
• consider Jackson’s alternative data formats: Smile, CBOR, JSON Arrays
1
3

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
GraalVM Native Images (experimental)
Prepared for GraalVM since Spring Framework 5.1
• avoiding unnecessary internal reflection
• skipping parameter name discovery
As of Spring Framework 5.2: custom setup for GraalVM 19 GA
• explicit reflection configuration and command line args necessary
• note: Graal's SubstrateVM is still an early adopter plugin in 19 GA
Expected for Spring Framework 5.3: out-of-the-box setup
• automatic reflection setup through custom Graal configuration integration
• https://github.com/spring-projects/spring-framework/wiki/GraalVM-native-image-support
1
4

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Looking Forward: OpenJDK’s Project Loom
“Fibers”
• lightweight user-mode threads
• efficient scheduling within the JVM
Classic Thread API adapted to fibers
• e.g. ThreadLocal effectively “fiber-local”
Fibers versus reactive programming
• new life for traditional synchronous programming arrangements
• reactive programming primarily for backpressure handling ?
• Spring MVC versus Spring WebFlux
1
5

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive @ All Levels
Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Web Results (with MVC or WebFlux)
@Controller
public class MyReactiveWebController {
...
@GetMapping("/users/{id}")
public Mono<User> getUser(@PathVariable Long id) {
return this.repository.findById(id);
}
@GetMapping("/users")
public Flux<User> getUsers() {
return this.repository.findAll();
}
}
1
7

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Transactions (e.g. with R2DBC)
@Service
public class MyReactiveTransactionalService {
...
@Transactional
public Mono<User> getUser(Long id) {
return this.repository.findById(id);
}
@Transactional
public Flux<User> getUsers() {
return this.repository.findAll();
}
}
1
8

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Transaction Setup
ReactiveTransactionManager SPI
• as an alternative to PlatformTransactionManager
• relies on Reactor context instead of ThreadLocals
Implementations for R2DBC, MongoDB, Neo4j
• available in Spring Data Moore
• also usable with programmatic TransactionalOperator
Common setup through @EnableTransactionManagement
• automatic adaptation to each annotated method signature
• works with any Reactive Streams Publisher as return value
1
9

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Messaging (e.g. with RSocket)
@Controller
public class MyReactiveMessagingController {
...
@MessageMapping("echo-async")
public Mono<String> echoAsync(String payload) {
return ...
}
@MessageMapping("echo-channel")
public Flux<String> echoChannel(Flux<String> payloads) {
return ...
}
}
2
0

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Application Events
@Service
public class MyReactiveApplicationEventService {
...
@EventListener
public Mono<MyOtherEvent> processWithResponse(MyEvent event) {
return ...
}
@EventListener
public CompletableFuture<MyOtherEvent> processAsync(MyEvent event) {
return ...
}
}
2
1

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive API Adapters
Spring automatically adapts common reactive API types
• according to return/parameter declarations in user components
• org.reactivestreams.Publisher interface or library-specific API types
• adapted to Reactor Flux/Mono for internal processing purposes
Traditionally supported: RxJava 1 & 2, j.u.c.Flow, CompletableFuture
• RxJava: Flowable, Observable, Single, Maybe, Completable
• on JDK 9+: java.util.concurrent.Flow.Publisher interface
New in 5.2: support for Kotlin coroutines (“suspend fun”)
• Flow and Deferred return values, as exposed by Kotlin-based code
2
2

Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Framework 5.2
Generally available now!
Java 8 API Refinements
Annotation Processing
Reactive Transactions
RSocket Messaging
Kotlin Coroutines
Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Boot 2.2
Generally available soon!
Building on
Spring Framework 5.2
& Spring Data Moore
Stay tuned!
Stay Connected.
Related updates across the Spring portfolio...
“Hello, Spring Security 5.2” (Tue 2:00pm)
“What’s New in Spring Data?” (Tue 3:20pm)
“Running Spring Boot Applications as
GraalVM Native Images” (Tue 4:20pm)
“Spring Performance Gains” (Thu 10:30am)
#springone@s1p

More Related Content

PDF
Spring framework 5: New Core and Reactive features
PDF
Multiplatform Apps with Spring, Kotlin, and RSocket
PDF
Reactive Spring Framework 5
PDF
Introducing Spring Framework 5.3
PDF
How and why to upgrade to java 16 or 17
PDF
Getting Reactive with Spring Framework 5.0’s GA release
PPTX
Reactive programming by spring webflux - DN Scrum Breakfast - Nov 2018
PDF
Spring - CDI Interop
Spring framework 5: New Core and Reactive features
Multiplatform Apps with Spring, Kotlin, and RSocket
Reactive Spring Framework 5
Introducing Spring Framework 5.3
How and why to upgrade to java 16 or 17
Getting Reactive with Spring Framework 5.0’s GA release
Reactive programming by spring webflux - DN Scrum Breakfast - Nov 2018
Spring - CDI Interop

What's hot (20)

PDF
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
PPTX
Next stop: Spring 4
PPTX
Spring boot
PDF
Introduction to WebMvc.fn
PPTX
Ready! Steady! SpringBoot!
PDF
Demo on JavaFX
ODP
Introduction to Spring Framework and Spring IoC
PDF
Serverless Spring
PDF
Spring MVC Framework
PDF
Microservices - java ee vs spring boot and spring cloud
PPTX
Workshop Framework(J2EE/OSGi/RCP)
PPTX
Spring framework-tutorial
PDF
Spring framework
PPTX
Spring boot
PPTX
High Performance Cloud Native APIs Using Apache Geode
PDF
Java 9 and Beyond
PDF
Spring framework Introduction
PDF
Apache DeltaSpike the CDI toolbox
PPT
Springboot introduction
PDF
PUC SE Day 2019 - SpringBoot
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Next stop: Spring 4
Spring boot
Introduction to WebMvc.fn
Ready! Steady! SpringBoot!
Demo on JavaFX
Introduction to Spring Framework and Spring IoC
Serverless Spring
Spring MVC Framework
Microservices - java ee vs spring boot and spring cloud
Workshop Framework(J2EE/OSGi/RCP)
Spring framework-tutorial
Spring framework
Spring boot
High Performance Cloud Native APIs Using Apache Geode
Java 9 and Beyond
Spring framework Introduction
Apache DeltaSpike the CDI toolbox
Springboot introduction
PUC SE Day 2019 - SpringBoot
Ad

Similar to Spring Framework 5.2: Core Container Revisited (20)

PPTX
Spring Framework 5.0: Hidden Gems
PDF
Spring Framework 4.0 to 4.1
PDF
JAZOON'13 - Sam Brannen - Spring Framework 4.0 - The Next Generation
PPTX
Introduction to Spring Framework
PPT
Java New Evolution
PDF
Spring Framework 4.0 - The Next Generation - Soft-Shake 2013
PDF
Extending spring
PDF
Application Architecture Trends
PPT
Spring 3.1: a Walking Tour
PPTX
unit_1_spring_1.pptxfgfgggjffgggddddgggg
PDF
iPOJO - The Simple Life - Richard Hall, Visiting Assistant Professor at Tufts...
PPTX
Spring Basics
PDF
Dynamic Guice Applications
PDF
Spring Framework
PPT
Spring ppt
PDF
Spring Framework Tutorial | VirtualNuggets
PPTX
Spring Framework Rohit
PPT
Spring - a framework written by developers
PPT
Tu1 1 5l
Spring Framework 5.0: Hidden Gems
Spring Framework 4.0 to 4.1
JAZOON'13 - Sam Brannen - Spring Framework 4.0 - The Next Generation
Introduction to Spring Framework
Java New Evolution
Spring Framework 4.0 - The Next Generation - Soft-Shake 2013
Extending spring
Application Architecture Trends
Spring 3.1: a Walking Tour
unit_1_spring_1.pptxfgfgggjffgggddddgggg
iPOJO - The Simple Life - Richard Hall, Visiting Assistant Professor at Tufts...
Spring Basics
Dynamic Guice Applications
Spring Framework
Spring ppt
Spring Framework Tutorial | VirtualNuggets
Spring Framework Rohit
Spring - a framework written by developers
Tu1 1 5l
Ad

More from VMware Tanzu (20)

PDF
Spring into AI presented by Dan Vega 5/14
PDF
What AI Means For Your Product Strategy And What To Do About It
PDF
Make the Right Thing the Obvious Thing at Cardinal Health 2023
PPTX
Enhancing DevEx and Simplifying Operations at Scale
PDF
Spring Update | July 2023
PPTX
Platforms, Platform Engineering, & Platform as a Product
PPTX
Building Cloud Ready Apps
PDF
Spring Boot 3 And Beyond
PDF
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
PDF
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
PDF
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
PPTX
tanzu_developer_connect.pptx
PDF
Tanzu Virtual Developer Connect Workshop - French
PDF
Tanzu Developer Connect Workshop - English
PDF
Virtual Developer Connect Workshop - English
PDF
Tanzu Developer Connect - French
PDF
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
PDF
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
PDF
SpringOne Tour: The Influential Software Engineer
PDF
SpringOne Tour: Domain-Driven Design: Theory vs Practice
Spring into AI presented by Dan Vega 5/14
What AI Means For Your Product Strategy And What To Do About It
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Enhancing DevEx and Simplifying Operations at Scale
Spring Update | July 2023
Platforms, Platform Engineering, & Platform as a Product
Building Cloud Ready Apps
Spring Boot 3 And Beyond
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
tanzu_developer_connect.pptx
Tanzu Virtual Developer Connect Workshop - French
Tanzu Developer Connect Workshop - English
Virtual Developer Connect Workshop - English
Tanzu Developer Connect - French
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: Domain-Driven Design: Theory vs Practice

Recently uploaded (20)

PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
Nekopoi APK 2025 free lastest update
PDF
top salesforce developer skills in 2025.pdf
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
System and Network Administraation Chapter 3
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
Designing Intelligence for the Shop Floor.pdf
Odoo Companies in India – Driving Business Transformation.pdf
Operating system designcfffgfgggggggvggggggggg
Adobe Illustrator 28.6 Crack My Vision of Vector Design
How to Choose the Right IT Partner for Your Business in Malaysia
Which alternative to Crystal Reports is best for small or large businesses.pdf
Reimagine Home Health with the Power of Agentic AI​
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Design an Analysis of Algorithms I-SECS-1021-03
How to Migrate SBCGlobal Email to Yahoo Easily
Nekopoi APK 2025 free lastest update
top salesforce developer skills in 2025.pdf
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
System and Network Administraation Chapter 3
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
2025 Textile ERP Trends: SAP, Odoo & Oracle
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Navsoft: AI-Powered Business Solutions & Custom Software Development
Designing Intelligence for the Shop Floor.pdf

Spring Framework 5.2: Core Container Revisited

  • 1. Spring Framework 5.2: Core Container Revisited Juergen Hoeller October 7–10, 2019 Austin Convention Center
  • 2. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Core API Revision
  • 3. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Java 8+ Baseline in Spring Framework 5 Entire framework codebase is Java 8 based • internal use of lambda expressions and collection streams • efficient introspection of constructor/method parameter signatures Framework APIs can expose Java 8 API types • Executable, CompletableFuture, Instant, Duration, Stream • java.util.function interfaces: Supplier, Consumer, Predicate Framework interfaces make use of Java 8 default methods • existing methods with default implementations for convenience • new methods with default implementations for backwards compatibility 3 
  • 4. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Nullability Comprehensive nullability declarations across the codebase • non-null by default + individual @Nullable declarations The Java effect: nullability validation in IntelliJ IDEA and Eclipse • allowing applications to validate their own interaction with Spring APIs The Kotlin effect: straightforward assignments to non-null variables • Kotlin compiler only allows such assignments for APIs with clear nullability Currently directly supported + JSR-305 meta-annotations • collaboration on common code analysis annotations with Google & JetBrains 4 
  • 5. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Programmatic Lookup via ObjectProvider @Autowired ObjectProvider<Foo> foo ObjectProvider<Foo> foo = ctx.getBeanProvider(Foo.class) ObjectProvider methods with nullability declarations ● @Nullable T getIfAvailable() ● @Nullable T getIfUnique() Overloaded variants with java.util.function callbacks (new in 5.0) ● T getIfAvailable(Supplier<T> defaultSupplier) ● void ifAvailable(Consumer<T> dependencyConsumer) ● T getIfUnique(Supplier<T> defaultSupplier) ● void ifUnique(Consumer<T> dependencyConsumer) 5 
  • 6. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bean Stream Retrieval via ObjectProvider @Autowired ObjectProvider<Foo> foo ObjectProvider<Foo> foo = ctx.getBeanProvider(Foo.class) Individual object retrieval (primary/unique) ● T getObject() ● @Nullable T getIfAvailable() ● @Nullable T getIfUnique() Iteration and stream retrieval (new in 5.1) ● Iterator<T> iterator() ● Stream<T> stream() ● Stream<T> orderedStream() 6 
  • 7. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Programmatic Bean Registration with Java 8 // Starting point may also be AnnotationConfigApplicationContext GenericApplicationContext ctx = new GenericApplicationContext(); ctx.registerBean(Foo.class); ctx.registerBean(Bar.class, () -> new Bar(ctx.getBean(Foo.class))); // Or alternatively with some bean definition customizing GenericApplicationContext ctx = new GenericApplicationContext(); ctx.registerBean(Foo.class, Foo::new); ctx.registerBean(Bar.class, () -> new Bar(ctx.getBeanProvider(Foo.class)), bd -> bd.setLazyInit(true)); 7 
  • 8. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Programmatic Bean Registration with Kotlin // Java-style usage of Spring's Kotlin extensions val ctx = GenericApplicationContext() ctx.registerBean(Foo::class) ctx.registerBean { Bar(it.getBean(Foo::class)) } // Gradle-style usage of Spring's Kotlin extensions val ctx = GenericApplicationContext { registerBean<Foo>() registerBean { Bar(it.getBean<Foo>()) } } 8 
  • 9. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Performance Tuning
  • 10. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Component Scanning Classpath scanning on startup may be slow • <context:component-scan> or @ComponentScan • file system traversal of all packages within the specified base packages The common solution: narrow your base packages • Spring only searches within the specified roots in the classpath • alternatively: fully enumerate your component classes (no scanning at all) New variant since 5.0: a build-time annotation processor • spring-context-indexer generates META-INF/spring.components per jar • automatically used at runtime for compatible component-scan declarations 1 0 
  • 11. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Annotation Processing New MergedAnnotations API in 5.2 • sophisticated introspection of meta-annotation arrangements • backing Spring's common AnnotationUtils and AnnotatedElementUtils now Enabling a custom annotation registry • registering presence/absence of certain annotations per component class • bean post-processors avoid unnecessary introspection of methods/fields Integration with indexers (e.g. Jandex) ? • adapting index metadata to Spring's annotation lookup facilities on startup • however, prototyping efforts did not lead to significant gains yet 11 
  • 12. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Component Model Implications Most efficient: purely programmatic functional registration • no component scanning, no reflective factory methods • no annotation-config setup (no annotation post-processors) @Configuration(proxyBeanMethods=false) in 5.2 • same effect: @Bean methods on non-@Configuration classes • avoiding runtime generation of CGLIB subclasses • drawback: no interception of cross-@Bean method calls Prefer interface-based proxies over CGLIB proxies • again: avoiding runtime generation of CGLIB subclasses 1 2 
  • 13. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Third-Party Libraries Persistence provider bootstrapping • consider specifying an async bootstrap executor for JPA / Hibernate • Spring Data+Boot: spring.data.jpa.repositories.bootstrap-mode=deferred Hibernate ORM 5.4.5 • internal performance improvements, lower memory consumption • optional: bytecode enhancement (also for lazy loading), Jandex integration Jackson 2.9 / 2.10 • Spring Framework 5.2 requires Jackson 2.9.7+, supports Jackson 2.10 • consider Jackson’s alternative data formats: Smile, CBOR, JSON Arrays 1 3 
  • 14. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ GraalVM Native Images (experimental) Prepared for GraalVM since Spring Framework 5.1 • avoiding unnecessary internal reflection • skipping parameter name discovery As of Spring Framework 5.2: custom setup for GraalVM 19 GA • explicit reflection configuration and command line args necessary • note: Graal's SubstrateVM is still an early adopter plugin in 19 GA Expected for Spring Framework 5.3: out-of-the-box setup • automatic reflection setup through custom Graal configuration integration • https://github.com/spring-projects/spring-framework/wiki/GraalVM-native-image-support 1 4 
  • 15. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Looking Forward: OpenJDK’s Project Loom “Fibers” • lightweight user-mode threads • efficient scheduling within the JVM Classic Thread API adapted to fibers • e.g. ThreadLocal effectively “fiber-local” Fibers versus reactive programming • new life for traditional synchronous programming arrangements • reactive programming primarily for backpressure handling ? • Spring MVC versus Spring WebFlux 1 5 
  • 16. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive @ All Levels
  • 17. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Web Results (with MVC or WebFlux) @Controller public class MyReactiveWebController { ... @GetMapping("/users/{id}") public Mono<User> getUser(@PathVariable Long id) { return this.repository.findById(id); } @GetMapping("/users") public Flux<User> getUsers() { return this.repository.findAll(); } } 1 7 
  • 18. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Transactions (e.g. with R2DBC) @Service public class MyReactiveTransactionalService { ... @Transactional public Mono<User> getUser(Long id) { return this.repository.findById(id); } @Transactional public Flux<User> getUsers() { return this.repository.findAll(); } } 1 8 
  • 19. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Transaction Setup ReactiveTransactionManager SPI • as an alternative to PlatformTransactionManager • relies on Reactor context instead of ThreadLocals Implementations for R2DBC, MongoDB, Neo4j • available in Spring Data Moore • also usable with programmatic TransactionalOperator Common setup through @EnableTransactionManagement • automatic adaptation to each annotated method signature • works with any Reactive Streams Publisher as return value 1 9 
  • 20. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Messaging (e.g. with RSocket) @Controller public class MyReactiveMessagingController { ... @MessageMapping("echo-async") public Mono<String> echoAsync(String payload) { return ... } @MessageMapping("echo-channel") public Flux<String> echoChannel(Flux<String> payloads) { return ... } } 2 0 
  • 21. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Application Events @Service public class MyReactiveApplicationEventService { ... @EventListener public Mono<MyOtherEvent> processWithResponse(MyEvent event) { return ... } @EventListener public CompletableFuture<MyOtherEvent> processAsync(MyEvent event) { return ... } } 2 1 
  • 22. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive API Adapters Spring automatically adapts common reactive API types • according to return/parameter declarations in user components • org.reactivestreams.Publisher interface or library-specific API types • adapted to Reactor Flux/Mono for internal processing purposes Traditionally supported: RxJava 1 & 2, j.u.c.Flow, CompletableFuture • RxJava: Flowable, Observable, Single, Maybe, Completable • on JDK 9+: java.util.concurrent.Flow.Publisher interface New in 5.2: support for Kotlin coroutines (“suspend fun”) • Flow and Deferred return values, as exposed by Kotlin-based code 2 2 
  • 23. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Framework 5.2 Generally available now! Java 8 API Refinements Annotation Processing Reactive Transactions RSocket Messaging Kotlin Coroutines
  • 24. Unless otherwise indicated, these slides are © 2013-2019 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Boot 2.2 Generally available soon! Building on Spring Framework 5.2 & Spring Data Moore Stay tuned!
  • 25. Stay Connected. Related updates across the Spring portfolio... “Hello, Spring Security 5.2” (Tue 2:00pm) “What’s New in Spring Data?” (Tue 3:20pm) “Running Spring Boot Applications as GraalVM Native Images” (Tue 4:20pm) “Spring Performance Gains” (Thu 10:30am) #springone@s1p