SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
September, 2020
What’s new in Spring Data
MongoDB
Copyright © 2020 VMware, Inc. or its affiliates.
Before We Start
Staying focused is hard :)
📨 📲 ☕
Documentation
Samples
...
🎬
🎥 🎧
Cover w/ Image
Agenda
● Newman Release (May 2020)
● 2020.0 (expected end Oct 2020)
codename Ockham
org.springframework.data
spring-data-releasetrain
Neumann-SR3
CUR
org.springframework.data
spring-data-bom
2020.0.0-M2
PRE
org.springframework.data
spring-data-mongodb
3.1.0-M2
PRE
Spring Data MongoDB 3.0 (Neumann)
Major version upgrade with some breaking changes
● Driver upgrades to 4.0
● Indexing Updates
● Updates via Aggregation pipeline
● Reactive GridFS changes
● Convenience
org.springframework.data
spring-data-mongodb
3.0.3
CUR
org.mongodb
mongodb-driver-reactivestreams
1.12.0
3.0 – Driver Upgrades
Dependency Changes
org.mongodb
mongo-java-driver
3.11.2
2.x
mongo-java-driver
sync
mongo-java-driver ...-driver-reactivestreams
reactive
org.mongodb
mongodb-driver-reactivestreams
4.0.5
org.mongodb
mongodb-driver-reactivestreams
1.12.0
3.0 – Driver Upgrades
Dependency Changes
org.mongodb
mongo-java-driver
3.11.2
org.mongodb
mongodb-driver-sync
4.0.5
org.mongodb
mongodb-driver-core
4.0.5
mongo-java-driver
mongo-java-driver ...-driver-reactivestreams
2.x 3.0
sync
reactive
mongodb-driver-core
mongodb-driver-sync
sync
mongodb-driver-reactivestreams
mongodb-driver-core
reactive
3.0 – Driver Upgrades
Configuration Changes – What it was like in 2.x
AbstractMongoConfiguration (2.x)
@Configuration
class Cfg extends AbstractMongoConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Override
public com.mongodb.MongoClient mongoClient() {
return new com.mongodb.MongoClient();
}
}
3.0 – Driver Upgrades
Configuration Changes – Driver Type
AbstractMongoClientConfiguration (3.x)
@Configuration
class Cfg extends AbstractMongoConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Override
public com.mongodb.MongoClient mongoClient() {
return new com.mongodb.MongoClient();
}
}
@Configuration
class Cfg extends AbstractMongoClientConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Override
public com.mongodb.client.MongoClient mongoClient() {
return MongoClients.create();
}
}
AbstractMongoConfiguration (2.x)
@Configuration
class Cfg extends AbstractMongoConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Override
public com.mongodb.MongoClient mongoClient() {
return new com.mongodb.MongoClient();
}
}
AbstractMongoConfiguration (2.x)
3.0 – Driver Upgrades
Configuration Changes – Client Creation
AbstractMongoClientConfiguration (3.x)
@Configuration
class Cfg extends AbstractMongoClientConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
}
3.0 – Driver Upgrades
Configuration Changes – Driver Settings
AbstractMongoClientConfiguration (3.x)
@Configuration
class Cfg extends AbstractMongoConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Override
public com.mongodb.MongoClient mongoClient() {
MongoClientURI uri = new MongoClientURI("!!...
return new MongoClient(uri));
}
}
@Configuration
class Cfg extends AbstractMongoClientConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Override
protected void configureClientSettings(Builder builder) {
builder.applyConnectionString(new ConnectionString("...
builder.uuidRepresentation(UuidRepresentation.STANDARD);
}
}
AbstractMongoConfiguration (2.x)
AbstractMongoClientConfiguration (3.x)
@Configuration
class Cfg extends AbstractMongoClientConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Override
protected void configureClientSettings(Builder builder) {
builder.applyConnectionString(new ConnectionString("!!..."));
builder.uuidRepresentation(UuidRepresentation.STANDARD);
}
@Override
protected boolean autoIndexCreation() {
return true;
}
}
3.0 – Driver Upgrades
Configuration Changes - Indexing
AbstractMongoConfiguration (2.x)
@Document
public class Person {
@Id private String id;
@Indexed(unique = true) private Integer ssn;
private String firstName;
@Indexed private String lastName;
private Integer age;
}
{…}
spring.data.mongodb.auto-index-creation
3.0 – Update via Aggregation Pipeline
{…}
{
"_id" : 1,
"student" : "Maya",
"homework" : [ 10, 5, 10 ],
"quiz" : [ 10, 8 ],
"extraCredit" : 0
}
totalHomework : { $sum : $homework }
totalQuiz : { $sum : $quiz }
totalScore : {
$add : [
"$totalHomework",
"$totalQuiz",
"$extraCredit“ ]}
Expressive, Conditional Updates
$addFields
$set
$unset
$replaceWith
$replaceRoot
$project
3.0 – Update via Aggregation Pipeline
{…}
{
"_id" : 1,
"student" : "Maya",
"homework" : [ 10, 5, 10 ],
"quiz" : [ 10, 8 ],
"extraCredit" : 0
}
totalHomework : { $sum : $homework }
totalQuiz : { $sum : $quiz }
totalScore : {
$add : [
"$totalHomework",
"$totalQuiz",
"$extraCredit“ ]}
public void calculateTotalScore() {
AggregationUpdate update = AggregationUpdate.update()
.set(SetOperation.builder()
.set("totalHomework").toValueOf(valueOf("homework").sum())
.and()
.set("totalQuiz").toValueOf(valueOf("quiz").sum())
.and()
.set("totalScore").toValueOf(
valueOf("totalHomework")
.add("totalQuiz")
.add("extraCredit ")));
mongoOperations.update(Student.class)
.apply(update)
.all();
}
Expressive, Conditional Updates
3.0 – Reactive GridFS
AsyncInputStream source = AsyncStreamHelper.toAsyncInputStream(resource.getInputStream());
gridFSops.store(source, “springone", "binary/octet-stream", metadata);
2.x
3.0 – Reactive GridFS
Flux<DataBuffer> source = ...
gridFSops.store(source, “springone", "binary/octet-stream", metadata);
public class ReactiveGridFsResource {
public Mono<GridFSFile> getGridFSFile() {
!!...
}
}
public Flux<DataBuffer> getContent() {
... // via GridFSDownloadPublisher
}
ReactiveGridFsResource s1p = gridFSops.getResources("s1p");
3.0
3.0 – Convenience
...somtimes it’s the small things
query(where("name")...)
.withHint(
new Document("att1", 1).append("att2", 1)
)
@Sharded
public class Person {
private @Id String id;
private String firstname;
}
Shard Support
template.query(Person.class)
.matching(where("firstname").is("luke"))
.one()
Narrow API
query(where("name")!!...).withHint("index-name")
Index Hints (via name)
template.query(Person.class)
.matching(query(where("firstname").is("luke")))
.one()
Spring Data MongoDB 3.1 (2020.0)
Closing gaps to the imperative implementation.
● Reactive SpEL in @Query annotations
● Reactive Auditing
● Repository Metrics
● GraalVM Native Image experience
● Read Only Transactions
codename: Ockham
The following section is intended to outline the general direction
of VMware's offerings. It is intended for information purposes
only and may not be incorporated into any contract. Any
information regarding pre-release of VMware offerings, future
updates or other planned modifications is subject to ongoing
evaluation by VMware and is subject to change. This information
is provided without warranty or any kind, express or implied, and
is not a commitment to deliver any material, code, or
functionality, and should not be relied upon in making
purchasing decisions regarding VMware's offerings. These
purchasing decisions should only be based on features currently
available. The development, release, and timing of any features
or functionality described for VMware's offerings in this
presentation remain at the sole discretion of VMware. VMware
has no obligation to update forward looking information in this
presentation.
org.springframework.data
spring-data-mongodb
3.1.0-M2
PRE
@Query("{ 'supervisor' : ?#{ hasRole('ROLE_ADMIN') ? new Document('$regex', '*') : principal.name } }")
Flux<Person> findAllFilteredByRole();
3.1 – Reactive SpEL
now truly reactive via ReactiveEvaluationContextExtension
Flux<Person> all = repo.findAllFilteredByRole();
all.subscribe();
2.x
⚡
3.1
👍
3.1 – Reactive Auditing
@CreatedBy, @CreatedDate, @LastMod...
@Configuration
@EnableReactiveMongoAuditing
static class AuditingConfig extends AbstractReactiveMongoConfiguration {
@Override
protected String getDatabaseName() {
return "database";
}
@Bean
public ReactiveAuditorAware<User> auditorProvider() {
return () -> ReactiveSecurityContextHolder.getContext()
.map(it -> ...);
}
}
repo.save(fiona).subscribe();
3.1 – Repository Metrics
Execution Time Measurement
PersonRepository.save(Object):
2 ms – SUCCESS
Flux<Person> all = repo.findAll();
repo.save(frank).subscribe();
all.subscribe();
interface PersonRepository extends ReactiveCrudRepository<Person, String> {
Flux<Person> findByName(String name);
@Query("{ 'name' : { '$set' : 'Gallagher' } }")
Flux<Person> findError();
}
PersonRepository.save(Object):
2 ms - SUCCESS
PersonRepository.findAll():
32 ms – SUCCESS
repo.findByName("fiona").subscribe();
repo.findError().subscribe();
PersonRespository.findByName(String):
1 ms - SUCCESS
PersonRepository.findError():
20 ms - ERROR
3.1 – Repository Metrics Setup
via Invocation Listeners
@Bean
public RepositoryMetricsPostProcessor repositoryMetricsPostProcessor() {
return new RepositoryMetricsPostProcessor();
}
static class RepositoryMetricsPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) ...
if (bean instanceof RepositoryFactoryBeanSupport) {
RepositoryFactoryBeanSupport<?, ?, ?> repositoryFactoryBean = (...) bean;
repositoryFactoryBean
.addRepositoryFactoryCustomizer(repositoryFactory -> {
repositoryFactory.addInvocationListener(System.out::println);
});
}
return bean;
}
}
3.1 – GraalVM Native Image
...with spring-graalvm-native
SpringDataComponentProcessor
org.springframework.experimental
spring-graalvm-native
0.7.1
SpringDataMongoDBTypeHints
@Query
@Aggregation
@Document
@Indexed
@DBRef
Nested Types
Infrastructure Components ... extends CrudRepository<T, ID>
Signature Types
Methods
Custom Implementations
3.1 – GraalVM Native Image
...with spring-graalvm-native
© 2020 Spring. A VMware-backed project.
Thank you
Contact us @SpringData
Data
- Staying Ahead of the Curve with Spring and Cassandra 4
- The Past Year in Spring for Apache Geode
- A Deep Dive into Spring Application Events
- Full Steam Ahead, R2DBC!
- Building Flexible APIs with Spring HATEOAS
DAY1
DAY2
GraalVM
- Modernizing Apps for the Cloud with Spring
- The Path Towards Spring Boot Native Applications
- Spring Boot Revisited with KoFu and JaFu
DAY1
DAY2
Questions?
org.springframework.data
spring-data-mongodb
3.0.3
org.springframework.experimental
spring-graalvm-native
0.7.1
CUR
org.springframework.data
spring-data-mongodb
3.1.0-M2
PRE
PRE

Mais conteúdo relacionado

Mais procurados

Spring Cloud Gateway on Kubernetes
Spring Cloud Gateway on KubernetesSpring Cloud Gateway on Kubernetes
Spring Cloud Gateway on KubernetesTakeshi Ogawa
 
REST vs GraphQL
REST vs GraphQLREST vs GraphQL
REST vs GraphQLSquareboat
 
Tutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHPTutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHPAndrew Rota
 
Developing Faster with Swagger
Developing Faster with SwaggerDeveloping Faster with Swagger
Developing Faster with SwaggerTony Tam
 
Djangoアプリの実践的設計手法
Djangoアプリの実践的設計手法Djangoアプリの実践的設計手法
Djangoアプリの実践的設計手法Ian Lewis
 
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1Takeshi Hirosue
 
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成するFlutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成するIgaHironobu
 
Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Toshiaki Maki
 
Rest API with Swagger and NodeJS
Rest API with Swagger and NodeJSRest API with Swagger and NodeJS
Rest API with Swagger and NodeJSLuigi Saetta
 
AOT and Native with Spring Boot 3.0
AOT and Native with Spring Boot 3.0AOT and Native with Spring Boot 3.0
AOT and Native with Spring Boot 3.0MoritzHalbritter
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
Document your rest api using swagger - Devoxx 2015
Document your rest api using swagger - Devoxx 2015Document your rest api using swagger - Devoxx 2015
Document your rest api using swagger - Devoxx 2015johannes_fiala
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOPDzmitry Naskou
 
Better APIs with GraphQL
Better APIs with GraphQL Better APIs with GraphQL
Better APIs with GraphQL Josh Price
 
GitHub Copilotとともに次の開発体験へ
GitHub Copilotとともに次の開発体験へGitHub Copilotとともに次の開発体験へ
GitHub Copilotとともに次の開発体験へKazumi IWANAGA
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTakahisa Iwamoto
 

Mais procurados (20)

Spring Cloud Gateway on Kubernetes
Spring Cloud Gateway on KubernetesSpring Cloud Gateway on Kubernetes
Spring Cloud Gateway on Kubernetes
 
REST vs GraphQL
REST vs GraphQLREST vs GraphQL
REST vs GraphQL
 
Tutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHPTutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHP
 
Developing Faster with Swagger
Developing Faster with SwaggerDeveloping Faster with Swagger
Developing Faster with Swagger
 
Djangoアプリの実践的設計手法
Djangoアプリの実践的設計手法Djangoアプリの実践的設計手法
Djangoアプリの実践的設計手法
 
Intro GraphQL
Intro GraphQLIntro GraphQL
Intro GraphQL
 
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
 
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成するFlutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
 
Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1
 
Rest API with Swagger and NodeJS
Rest API with Swagger and NodeJSRest API with Swagger and NodeJS
Rest API with Swagger and NodeJS
 
AOT and Native with Spring Boot 3.0
AOT and Native with Spring Boot 3.0AOT and Native with Spring Boot 3.0
AOT and Native with Spring Boot 3.0
 
django
djangodjango
django
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Document your rest api using swagger - Devoxx 2015
Document your rest api using swagger - Devoxx 2015Document your rest api using swagger - Devoxx 2015
Document your rest api using swagger - Devoxx 2015
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
Angular js PPT
Angular js PPTAngular js PPT
Angular js PPT
 
Better APIs with GraphQL
Better APIs with GraphQL Better APIs with GraphQL
Better APIs with GraphQL
 
GitHub Copilotとともに次の開発体験へ
GitHub Copilotとともに次の開発体験へGitHub Copilotとともに次の開発体験へ
GitHub Copilotとともに次の開発体験へ
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 

Semelhante a What’s New in Spring Data MongoDB

Walking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data FlowWalking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data FlowVMware Tanzu
 
PRG 420 Week 3 Individual Assignment Netbeans Project (annual co.docx
PRG 420 Week 3 Individual Assignment Netbeans Project (annual co.docxPRG 420 Week 3 Individual Assignment Netbeans Project (annual co.docx
PRG 420 Week 3 Individual Assignment Netbeans Project (annual co.docxharrisonhoward80223
 
Evolution is Continuous, and so are Big Data and Streaming Pipelines
Evolution is Continuous, and so are Big Data and Streaming PipelinesEvolution is Continuous, and so are Big Data and Streaming Pipelines
Evolution is Continuous, and so are Big Data and Streaming PipelinesDatabricks
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard IntroductionAnthony Chen
 
How to Webpack your Django!
How to Webpack your Django!How to Webpack your Django!
How to Webpack your Django!David Gibbons
 
Spring Performance Gains
Spring Performance GainsSpring Performance Gains
Spring Performance GainsVMware Tanzu
 
What's Next Replay - SpringSource
What's Next Replay - SpringSourceWhat's Next Replay - SpringSource
What's Next Replay - SpringSourceZenikaOuest
 
InterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.jsInterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.jsChris Bailey
 
Simplify Cloud Applications using Spring Cloud
Simplify Cloud Applications using Spring CloudSimplify Cloud Applications using Spring Cloud
Simplify Cloud Applications using Spring CloudRamnivas Laddad
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applicationsAstrails
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'sAntônio Roberto Silva
 
Infinum Android Talks #14 - Data binding to the rescue... or not (?) by Krist...
Infinum Android Talks #14 - Data binding to the rescue... or not (?) by Krist...Infinum Android Talks #14 - Data binding to the rescue... or not (?) by Krist...
Infinum Android Talks #14 - Data binding to the rescue... or not (?) by Krist...Infinum
 
Play vs Grails Smackdown - Devoxx France 2013
Play vs Grails Smackdown - Devoxx France 2013Play vs Grails Smackdown - Devoxx France 2013
Play vs Grails Smackdown - Devoxx France 2013Matt Raible
 
Projeto-web-services-Spring-Boot-JPA.pdf
Projeto-web-services-Spring-Boot-JPA.pdfProjeto-web-services-Spring-Boot-JPA.pdf
Projeto-web-services-Spring-Boot-JPA.pdfAdrianoSantos888423
 
Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)Gunith Devasurendra
 
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdfdokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdfAppster1
 
dokumen.tips_rediscovering-spring-with-spring-boot1.pdf
dokumen.tips_rediscovering-spring-with-spring-boot1.pdfdokumen.tips_rediscovering-spring-with-spring-boot1.pdf
dokumen.tips_rediscovering-spring-with-spring-boot1.pdfAppster1
 

Semelhante a What’s New in Spring Data MongoDB (20)

Walking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data FlowWalking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data Flow
 
PRG 420 Week 3 Individual Assignment Netbeans Project (annual co.docx
PRG 420 Week 3 Individual Assignment Netbeans Project (annual co.docxPRG 420 Week 3 Individual Assignment Netbeans Project (annual co.docx
PRG 420 Week 3 Individual Assignment Netbeans Project (annual co.docx
 
Evolution is Continuous, and so are Big Data and Streaming Pipelines
Evolution is Continuous, and so are Big Data and Streaming PipelinesEvolution is Continuous, and so are Big Data and Streaming Pipelines
Evolution is Continuous, and so are Big Data and Streaming Pipelines
 
Droidcon Paris 2015
Droidcon Paris 2015Droidcon Paris 2015
Droidcon Paris 2015
 
Azure from scratch part 4
Azure from scratch part 4Azure from scratch part 4
Azure from scratch part 4
 
Dropwizard Introduction
Dropwizard IntroductionDropwizard Introduction
Dropwizard Introduction
 
How to Webpack your Django!
How to Webpack your Django!How to Webpack your Django!
How to Webpack your Django!
 
Spring Performance Gains
Spring Performance GainsSpring Performance Gains
Spring Performance Gains
 
What's Next Replay - SpringSource
What's Next Replay - SpringSourceWhat's Next Replay - SpringSource
What's Next Replay - SpringSource
 
InterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.jsInterConnect2016: WebApp Architectures with Java and Node.js
InterConnect2016: WebApp Architectures with Java and Node.js
 
Simplify Cloud Applications using Spring Cloud
Simplify Cloud Applications using Spring CloudSimplify Cloud Applications using Spring Cloud
Simplify Cloud Applications using Spring Cloud
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applications
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
 
Infinum Android Talks #14 - Data binding to the rescue... or not (?) by Krist...
Infinum Android Talks #14 - Data binding to the rescue... or not (?) by Krist...Infinum Android Talks #14 - Data binding to the rescue... or not (?) by Krist...
Infinum Android Talks #14 - Data binding to the rescue... or not (?) by Krist...
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
 
Play vs Grails Smackdown - Devoxx France 2013
Play vs Grails Smackdown - Devoxx France 2013Play vs Grails Smackdown - Devoxx France 2013
Play vs Grails Smackdown - Devoxx France 2013
 
Projeto-web-services-Spring-Boot-JPA.pdf
Projeto-web-services-Spring-Boot-JPA.pdfProjeto-web-services-Spring-Boot-JPA.pdf
Projeto-web-services-Spring-Boot-JPA.pdf
 
Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)
 
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdfdokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
 
dokumen.tips_rediscovering-spring-with-spring-boot1.pdf
dokumen.tips_rediscovering-spring-with-spring-boot1.pdfdokumen.tips_rediscovering-spring-with-spring-boot1.pdf
dokumen.tips_rediscovering-spring-with-spring-boot1.pdf
 

Mais de VMware Tanzu

What AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItWhat AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItVMware Tanzu
 
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023VMware Tanzu
 
Enhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleEnhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleVMware Tanzu
 
Spring Update | July 2023
Spring Update | July 2023Spring Update | July 2023
Spring Update | July 2023VMware Tanzu
 
Platforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductPlatforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductVMware Tanzu
 
Building Cloud Ready Apps
Building Cloud Ready AppsBuilding Cloud Ready Apps
Building Cloud Ready AppsVMware Tanzu
 
Spring Boot 3 And Beyond
Spring Boot 3 And BeyondSpring Boot 3 And Beyond
Spring Boot 3 And BeyondVMware Tanzu
 
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfVMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023VMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023VMware Tanzu
 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptxVMware Tanzu
 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchVMware Tanzu
 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishVMware Tanzu
 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVMware Tanzu
 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - FrenchVMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023VMware Tanzu
 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootVMware Tanzu
 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerVMware Tanzu
 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeVMware Tanzu
 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsVMware Tanzu
 

Mais de VMware Tanzu (20)

What AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItWhat AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About It
 
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023
 
Enhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleEnhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at Scale
 
Spring Update | July 2023
Spring Update | July 2023Spring Update | July 2023
Spring Update | July 2023
 
Platforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductPlatforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a Product
 
Building Cloud Ready Apps
Building Cloud Ready AppsBuilding Cloud Ready Apps
Building Cloud Ready Apps
 
Spring Boot 3 And Beyond
Spring Boot 3 And BeyondSpring Boot 3 And Beyond
Spring Boot 3 And Beyond
 
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
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 | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptx
 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - French
 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - English
 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - English
 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - French
 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software Engineer
 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs Practice
 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
 

Último

%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...masabamasaba
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Hararemasabamasaba
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...masabamasaba
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benonimasabamasaba
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxAnnaArtyushina1
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...chiefasafspells
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyviewmasabamasaba
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrainmasabamasaba
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...Jittipong Loespradit
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 

Último (20)

%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 

What’s New in Spring Data MongoDB

  • 1. September, 2020 What’s new in Spring Data MongoDB Copyright © 2020 VMware, Inc. or its affiliates.
  • 2. Before We Start Staying focused is hard :) 📨 📲 ☕ Documentation Samples ... 🎬 🎥 🎧
  • 3. Cover w/ Image Agenda ● Newman Release (May 2020) ● 2020.0 (expected end Oct 2020) codename Ockham org.springframework.data spring-data-releasetrain Neumann-SR3 CUR org.springframework.data spring-data-bom 2020.0.0-M2 PRE org.springframework.data spring-data-mongodb 3.1.0-M2 PRE
  • 4. Spring Data MongoDB 3.0 (Neumann) Major version upgrade with some breaking changes ● Driver upgrades to 4.0 ● Indexing Updates ● Updates via Aggregation pipeline ● Reactive GridFS changes ● Convenience org.springframework.data spring-data-mongodb 3.0.3 CUR
  • 5. org.mongodb mongodb-driver-reactivestreams 1.12.0 3.0 – Driver Upgrades Dependency Changes org.mongodb mongo-java-driver 3.11.2 2.x mongo-java-driver sync mongo-java-driver ...-driver-reactivestreams reactive
  • 6. org.mongodb mongodb-driver-reactivestreams 4.0.5 org.mongodb mongodb-driver-reactivestreams 1.12.0 3.0 – Driver Upgrades Dependency Changes org.mongodb mongo-java-driver 3.11.2 org.mongodb mongodb-driver-sync 4.0.5 org.mongodb mongodb-driver-core 4.0.5 mongo-java-driver mongo-java-driver ...-driver-reactivestreams 2.x 3.0 sync reactive mongodb-driver-core mongodb-driver-sync sync mongodb-driver-reactivestreams mongodb-driver-core reactive
  • 7. 3.0 – Driver Upgrades Configuration Changes – What it was like in 2.x AbstractMongoConfiguration (2.x) @Configuration class Cfg extends AbstractMongoConfiguration { @Override protected String getDatabaseName() { return "database"; } @Override public com.mongodb.MongoClient mongoClient() { return new com.mongodb.MongoClient(); } }
  • 8. 3.0 – Driver Upgrades Configuration Changes – Driver Type AbstractMongoClientConfiguration (3.x) @Configuration class Cfg extends AbstractMongoConfiguration { @Override protected String getDatabaseName() { return "database"; } @Override public com.mongodb.MongoClient mongoClient() { return new com.mongodb.MongoClient(); } } @Configuration class Cfg extends AbstractMongoClientConfiguration { @Override protected String getDatabaseName() { return "database"; } @Override public com.mongodb.client.MongoClient mongoClient() { return MongoClients.create(); } } AbstractMongoConfiguration (2.x)
  • 9. @Configuration class Cfg extends AbstractMongoConfiguration { @Override protected String getDatabaseName() { return "database"; } @Override public com.mongodb.MongoClient mongoClient() { return new com.mongodb.MongoClient(); } } AbstractMongoConfiguration (2.x) 3.0 – Driver Upgrades Configuration Changes – Client Creation AbstractMongoClientConfiguration (3.x) @Configuration class Cfg extends AbstractMongoClientConfiguration { @Override protected String getDatabaseName() { return "database"; } }
  • 10. 3.0 – Driver Upgrades Configuration Changes – Driver Settings AbstractMongoClientConfiguration (3.x) @Configuration class Cfg extends AbstractMongoConfiguration { @Override protected String getDatabaseName() { return "database"; } @Override public com.mongodb.MongoClient mongoClient() { MongoClientURI uri = new MongoClientURI("!!... return new MongoClient(uri)); } } @Configuration class Cfg extends AbstractMongoClientConfiguration { @Override protected String getDatabaseName() { return "database"; } @Override protected void configureClientSettings(Builder builder) { builder.applyConnectionString(new ConnectionString("... builder.uuidRepresentation(UuidRepresentation.STANDARD); } } AbstractMongoConfiguration (2.x)
  • 11. AbstractMongoClientConfiguration (3.x) @Configuration class Cfg extends AbstractMongoClientConfiguration { @Override protected String getDatabaseName() { return "database"; } @Override protected void configureClientSettings(Builder builder) { builder.applyConnectionString(new ConnectionString("!!...")); builder.uuidRepresentation(UuidRepresentation.STANDARD); } @Override protected boolean autoIndexCreation() { return true; } } 3.0 – Driver Upgrades Configuration Changes - Indexing AbstractMongoConfiguration (2.x) @Document public class Person { @Id private String id; @Indexed(unique = true) private Integer ssn; private String firstName; @Indexed private String lastName; private Integer age; } {…} spring.data.mongodb.auto-index-creation
  • 12. 3.0 – Update via Aggregation Pipeline {…} { "_id" : 1, "student" : "Maya", "homework" : [ 10, 5, 10 ], "quiz" : [ 10, 8 ], "extraCredit" : 0 } totalHomework : { $sum : $homework } totalQuiz : { $sum : $quiz } totalScore : { $add : [ "$totalHomework", "$totalQuiz", "$extraCredit“ ]} Expressive, Conditional Updates $addFields $set $unset $replaceWith $replaceRoot $project
  • 13. 3.0 – Update via Aggregation Pipeline {…} { "_id" : 1, "student" : "Maya", "homework" : [ 10, 5, 10 ], "quiz" : [ 10, 8 ], "extraCredit" : 0 } totalHomework : { $sum : $homework } totalQuiz : { $sum : $quiz } totalScore : { $add : [ "$totalHomework", "$totalQuiz", "$extraCredit“ ]} public void calculateTotalScore() { AggregationUpdate update = AggregationUpdate.update() .set(SetOperation.builder() .set("totalHomework").toValueOf(valueOf("homework").sum()) .and() .set("totalQuiz").toValueOf(valueOf("quiz").sum()) .and() .set("totalScore").toValueOf( valueOf("totalHomework") .add("totalQuiz") .add("extraCredit "))); mongoOperations.update(Student.class) .apply(update) .all(); } Expressive, Conditional Updates
  • 14. 3.0 – Reactive GridFS AsyncInputStream source = AsyncStreamHelper.toAsyncInputStream(resource.getInputStream()); gridFSops.store(source, “springone", "binary/octet-stream", metadata); 2.x
  • 15. 3.0 – Reactive GridFS Flux<DataBuffer> source = ... gridFSops.store(source, “springone", "binary/octet-stream", metadata); public class ReactiveGridFsResource { public Mono<GridFSFile> getGridFSFile() { !!... } } public Flux<DataBuffer> getContent() { ... // via GridFSDownloadPublisher } ReactiveGridFsResource s1p = gridFSops.getResources("s1p"); 3.0
  • 16. 3.0 – Convenience ...somtimes it’s the small things query(where("name")...) .withHint( new Document("att1", 1).append("att2", 1) ) @Sharded public class Person { private @Id String id; private String firstname; } Shard Support template.query(Person.class) .matching(where("firstname").is("luke")) .one() Narrow API query(where("name")!!...).withHint("index-name") Index Hints (via name) template.query(Person.class) .matching(query(where("firstname").is("luke"))) .one()
  • 17. Spring Data MongoDB 3.1 (2020.0) Closing gaps to the imperative implementation. ● Reactive SpEL in @Query annotations ● Reactive Auditing ● Repository Metrics ● GraalVM Native Image experience ● Read Only Transactions codename: Ockham The following section is intended to outline the general direction of VMware's offerings. It is intended for information purposes only and may not be incorporated into any contract. Any information regarding pre-release of VMware offerings, future updates or other planned modifications is subject to ongoing evaluation by VMware and is subject to change. This information is provided without warranty or any kind, express or implied, and is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions regarding VMware's offerings. These purchasing decisions should only be based on features currently available. The development, release, and timing of any features or functionality described for VMware's offerings in this presentation remain at the sole discretion of VMware. VMware has no obligation to update forward looking information in this presentation. org.springframework.data spring-data-mongodb 3.1.0-M2 PRE
  • 18. @Query("{ 'supervisor' : ?#{ hasRole('ROLE_ADMIN') ? new Document('$regex', '*') : principal.name } }") Flux<Person> findAllFilteredByRole(); 3.1 – Reactive SpEL now truly reactive via ReactiveEvaluationContextExtension Flux<Person> all = repo.findAllFilteredByRole(); all.subscribe(); 2.x ⚡ 3.1 👍
  • 19. 3.1 – Reactive Auditing @CreatedBy, @CreatedDate, @LastMod... @Configuration @EnableReactiveMongoAuditing static class AuditingConfig extends AbstractReactiveMongoConfiguration { @Override protected String getDatabaseName() { return "database"; } @Bean public ReactiveAuditorAware<User> auditorProvider() { return () -> ReactiveSecurityContextHolder.getContext() .map(it -> ...); } }
  • 20. repo.save(fiona).subscribe(); 3.1 – Repository Metrics Execution Time Measurement PersonRepository.save(Object): 2 ms – SUCCESS Flux<Person> all = repo.findAll(); repo.save(frank).subscribe(); all.subscribe(); interface PersonRepository extends ReactiveCrudRepository<Person, String> { Flux<Person> findByName(String name); @Query("{ 'name' : { '$set' : 'Gallagher' } }") Flux<Person> findError(); } PersonRepository.save(Object): 2 ms - SUCCESS PersonRepository.findAll(): 32 ms – SUCCESS repo.findByName("fiona").subscribe(); repo.findError().subscribe(); PersonRespository.findByName(String): 1 ms - SUCCESS PersonRepository.findError(): 20 ms - ERROR
  • 21. 3.1 – Repository Metrics Setup via Invocation Listeners @Bean public RepositoryMetricsPostProcessor repositoryMetricsPostProcessor() { return new RepositoryMetricsPostProcessor(); } static class RepositoryMetricsPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) ... if (bean instanceof RepositoryFactoryBeanSupport) { RepositoryFactoryBeanSupport<?, ?, ?> repositoryFactoryBean = (...) bean; repositoryFactoryBean .addRepositoryFactoryCustomizer(repositoryFactory -> { repositoryFactory.addInvocationListener(System.out::println); }); } return bean; } }
  • 22. 3.1 – GraalVM Native Image ...with spring-graalvm-native SpringDataComponentProcessor org.springframework.experimental spring-graalvm-native 0.7.1 SpringDataMongoDBTypeHints @Query @Aggregation @Document @Indexed @DBRef Nested Types Infrastructure Components ... extends CrudRepository<T, ID> Signature Types Methods Custom Implementations
  • 23. 3.1 – GraalVM Native Image ...with spring-graalvm-native
  • 24. © 2020 Spring. A VMware-backed project. Thank you Contact us @SpringData Data - Staying Ahead of the Curve with Spring and Cassandra 4 - The Past Year in Spring for Apache Geode - A Deep Dive into Spring Application Events - Full Steam Ahead, R2DBC! - Building Flexible APIs with Spring HATEOAS DAY1 DAY2 GraalVM - Modernizing Apps for the Cloud with Spring - The Path Towards Spring Boot Native Applications - Spring Boot Revisited with KoFu and JaFu DAY1 DAY2