Reaktiv datatilgang og integrasjon
Koble WebFlux-applikasjoner til reaktive datalagre og integrer dem med andre reaktive komponenter.
Reaktiv datatilgang og integrasjon er en gratis leksjon i Komplett guide til Spring Boot 4 på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Komplett guide til Spring Boot 4, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Komplett guide til Spring Boot 4 inneholder totalt 4 leksjoner.
Behov for reaktiv datatilgang
Når De bygger reaktive applikasjoner med Spring WebFlux, vil tradisjonelle datatilgangsmetoder som Spring Data JPA eller vanlig JDBC ikke fungere. Hvorfor?
Disse metodene er blokkerende. De setter applikasjonstråden på pause mens den venter på at databaseoperasjoner skal fullføres. Dette strider mot den ikke-blokkerende, asynkrone naturen til reaktiv programmering.
Introduksjon til reaktive datalagre
For å opprettholde den reaktive flyten trenger vi reaktive datalagre og drivere som støtter ikke-blokkerende I/O. Disse driverne returnerer Mono eller Flux, slik at applikasjonen kan utføre annet arbeid mens databasen behandler forespørsler.
Vanlige reaktive databaser omfatter:
- MongoDB: En NoSQL-dokumentdatabase.
- Cassandra: Et NoSQL-datalager med brede kolonner.
- Redis: Et NoSQL-nøkkel-verdi-datalager, ofte brukt til hurtigbufring.
- R2DBC: (Reactive Relational Database Connectivity) for relasjonsdatabaser som PostgreSQL, MySQL og H2.
Konfigurere reaktiv MongoDB
I eksemplene våre fokuserer vi på MongoDB, som er et populært valg for reaktive applikasjoner. Først trenger De riktig avhengighet i pom.xml (Maven) eller build.gradle (Gradle):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>Denne starteren inkluderer Spring Data MongoDB Reactive, slik at De enkelt kan samhandle med MongoDB på en ikke-blokkerende måte.
Definere reaktive entiteter
Akkurat som med tradisjonell Spring Data definerer De entiteter som kobles til databasesamlingene Deres. For MongoDB bruker De annotasjonen @Document.
Annotasjonen @Id markerer feltet for primærnøkkelen. Dette forteller Spring Data hvordan unike dokumenter skal identifiseres.
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "products")
public class Product {
@Id
private String id;
private String name;
private double price;
public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
// Getters and Setters (omitted for brevity)
public String getId() { return id; }
public String getName() { return name; }
public double getPrice() { return price; }
@Override
public String toString() {
return "Product{id='" + id + "', name='" + name + "'}";
}
}Opprette reaktive repositorier
For å utføre CRUD-operasjoner (Create, Read, Update, Delete) på entitetene Deres oppretter De repository-grensesnitt. For reaktiv MongoDB utvider De ReactiveMongoRepository.
Dette grensesnittet tilbyr automatisk reaktive versjoner av vanlige operasjoner, som returnerer Mono for enkeltresultater og Flux for flere resultater.
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ProductRepository extends ReactiveMongoRepository<Product, String> {
// Custom reactive query methods can be added here
Mono<Product> findByName(String name);
Flux<Product> findByPriceGreaterThan(double price);
}Simulere reaktiv lagring
Når De lagrer en entitet ved hjelp av et reaktivt repository, returnerer det en Mono<Product>. Denne Mono-en representerer produktet etter at det er lagret. De abonnerer på den for å utløse operasjonen og håndtere resultatet.
Prøv å kjøre dette eksempelet for å se hvordan en reaktiv lagringsoperasjon kan håndteres:
import reactor.core.publisher.Mono;
class Item {
String id;
String name;
public Item(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() { return "Item{name='" + name + "'} "; }
}
public class Main {
public static void main(String[] args) {
Item newItem = new Item("101", "Reactive Widget");
// Simulate a reactive repository save method
Mono<Item> savedItemMono = Mono.just(newItem)
.doOnSuccess(item -> System.out.println("Simulating DB save for: " + item.name));
System.out.println("Initiating save operation...");
savedItemMono.subscribe(
item -> System.out.println("Saved item received: " + item),
error -> System.err.println("Error: " + error.getMessage()),
() -> System.out.println("Save process completed.")
);
}
}Simulere reaktiv henting
Reaktiv henting av data fungerer på lignende måte. For ett enkelt element (for eksempel etter ID) får De en Mono. For flere elementer får De en Flux. De abonnerer på disse publisherne for å bruke dataene.
Kjør denne koden for å se hvordan Mono og Flux brukes til å håndtere hentede data:
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.List;
class User {
String id;
String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() { return "User{name='" + name + "'} "; }
}
public class Main {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("U1", "Alice"),
new User("U2", "Bob"),
new User("U3", "Charlie")
);
// Simulate finding a single user by ID
Mono<User> userMono = Mono.just(users.get(0));
System.out.println("\n--- Finding single user ---");
userMono.subscribe(user -> System.out.println("Found: " + user));
// Simulate finding all users
Flux<User> userFlux = Flux.fromIterable(users);
System.out.println("\n--- Finding all users ---");
userFlux.subscribe(user -> System.out.println("Found: " + user));
}
}Integrere med reaktive tjenester
I en Spring WebFlux-applikasjon vil tjenestelaget sette inn de reaktive repositoryene og bruke returtypene Mono og Flux. Dette gjør det mulig å kjede reaktive operasjoner sømløst.
En tjenestemetode kan for eksempel lagre et produkt og deretter returnere ID-en til det lagrede produktet, alt innenfor en reaktiv strøm.
import reactor.core.publisher.Mono;
// Assume Product and ProductRepository are defined elsewhere
// import your.package.Product;
// import your.package.ProductRepository;
// This is a simplified example, not a full runnable app
// as it would require a full Spring Boot context.
class ProductService {
private final ProductRepository productRepository;
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public Mono<String> createProduct(Product product) {
return productRepository.save(product)
.map(Product::getId);
}
public Mono<Product> getProductById(String id) {
return productRepository.findById(id);
}
}Kjede reaktive dataoperasjoner
Den virkelige styrken ved reaktiv datatilgang viser seg når De kjeder operasjoner. De kan transformere, filtrere og kombinere Mono- og Flux-strømmer fra databasen med andre reaktive kilder, for eksempel eksterne API-kall eller annen tjenestelogikk.
Dette gjør det mulig å bygge komplekse, ikke-blokkerende dataflyter effektivt.
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
// Simulate fetching user IDs from a database (Flux)
Flux<String> userIds = Flux.just("userA", "userB", "userC");
// Simulate fetching user details for each ID (Mono)
Flux<String> userNames = userIds.delayElements(Duration.ofMillis(50))
.flatMap(id -> Mono.just("Name_" + id.toUpperCase()));
System.out.println("Fetching and transforming user data...");
userNames.subscribe(
name -> System.out.println("Processed User: " + name),
error -> System.err.println("Error: " + error.getMessage()),
() -> System.out.println("All users processed.")
);
// Keep main thread alive for async operations
try { Thread.sleep(500); } catch (InterruptedException e) {}
}
}Hurtigsjekk: Reaktive repositorier
De bygger en Spring WebFlux-applikasjon og må koble til en MongoDB-database på en ikke-blokkerende måte. Hvilket Spring Data-grensesnitt bør De utvide for repositoryet for å få reaktive CRUD-operasjoner?
Oppsummering: Reaktiv datatilgang
Godt jobbet! I denne leksjonen har De lært om betydningen av reaktiv datatilgang i Spring WebFlux-applikasjoner og hvordan dette oppnås.
- Tradisjonell blokkerende datatilgang erstattes av ikke-blokkerende reaktive drivere.
- Spring Data tilbyr grensesnitt som
ReactiveMongoRepositoryfor reaktiv CRUD. - Disse repositoryene returnerer
Mono(for enkeltobjekter) ogFlux(for flere objekter). - De kan sømløst kjede reaktive operasjoner fra datatilgang med andre reaktive komponenter.
Dette er viktig kunnskap for å bygge virkelig ende-til-ende-reaktive applikasjoner!
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 21
- Leksjoner
- 84
Ofte stilte spørsmål
Er leksjonen «Reaktiv datatilgang og integrasjon» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Komplett guide til Spring Boot 4, inkludert «Reaktiv datatilgang og integrasjon», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Komplett guide til Spring Boot 4 inneholder totalt 4 leksjoner.
Hva lærer jeg i «Reaktiv datatilgang og integrasjon»?
Koble WebFlux-applikasjoner til reaktive datalagre og integrer dem med andre reaktive komponenter. Du øver på Komplett guide til Spring Boot 4 med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Komplett guide til Spring Boot 4?
Ingen tidligere erfaring er nødvendig. Komplett guide til Spring Boot 4 på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Reaktiv datatilgang og integrasjon»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Komplett guide til Spring Boot 4-leksjonen?
Ja. Alle Komplett guide til Spring Boot 4-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Introduksjon til reaktiv programmering
- Spring WebFlux og Reactor Core
- Reaktiv datatilgang og integrasjon
- Backpressure og feilhåndtering i reaktive strømmer