Spring Boot 4:n kattava opas · Oppitunti

Reaktiivinen tietojen käyttö ja integrointi

Yhdistäkää WebFlux-sovelluksia reaktiivisiin tietovarastoihin ja integroikaa ne muihin reaktiivisiin komponentteihin.

Oppitunti 3/411 vaihetta

Reaktiivinen tietojen käyttö ja integrointi on ilmainen Spring Boot 4:n kattava opas-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Spring Boot 4:n kattava opas-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Boot 4:n kattava opas-kurssilla on yhteensä 4 oppituntia.

Reaktiivisen datan käytön tarpeet

Kun rakennatte reaktiivisia sovelluksia Spring WebFluxilla, perinteiset datankäyttömenetelmät, kuten Spring Data JPA tai tavallinen JDBC, eivät toimi. Miksi?

Nämä menetelmät ovat blokkaavia. Ne pysäyttävät sovelluksen säikeen tietokantaoperaatioiden valmistumista odotettaessa. Tämä on ristiriidassa reaktiivisen ohjelmoinnin ei-blokkaavan ja asynkronisen luonteen kanssa.

Reaktiivisiin tietovarastoihin tutustuminen

Reaktiivisen työnkulun säilyttämiseksi tarvitsemme reaktiivisia tietovarastoja ja ei-blokkaavaa I/O:ta tukevia ajureita. Nämä ajurit palauttavat Mono- tai Flux-olion, jolloin sovellus voi tehdä muuta työtä tietokannan käsitellessä pyyntöjä.

Yleisiä reaktiivisia tietokantoja ovat:

  • MongoDB: NoSQL-dokumenttitietokanta.
  • Cassandra: NoSQL-saraketietokanta.
  • Redis: NoSQL-avain–arvo-tietovarasto, jota käytetään usein välimuistina.
  • R2DBC: (Reactive Relational Database Connectivity) relaatiotietokantoja, kuten PostgreSQL:ää, MySQL:ää ja H2:ta, varten.

Reaktiivisen MongoDB:n määrittäminen

Esimerkeissämme keskitymme MongoDB:hen, joka on suosittu valinta reaktiivisiin sovelluksiin. Ensin tarvitsette oikean riippuvuuden tiedostoon pom.xml (Maven) tai build.gradle (Gradle):

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency>

Tämä starter-riippuvuus tuo käyttöön Spring Data MongoDB Reactiven, jonka avulla MongoDB:n kanssa voi olla helposti vuorovaikutuksessa ei-blokkaavalla tavalla.

Reaktiivisten entiteettien määrittäminen

Perinteisen Spring Datan tapaan määritätte entiteetit, jotka vastaavat tietokannan kokoelmia. MongoDB:tä varten käytätte @Document-annotaatiota.

@Id-annotaatio merkitsee ensisijaisen avaimen kentän. Näin Spring Data tietää, miten yksilölliset dokumentit tunnistetaan.

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 + "'}";
  }
}

Reaktiivisten repositorioiden luominen

Entiteettien CRUD-operaatioita (Create, Read, Update, Delete) varten luotte repositorioiden rajapinnat. Reaktiivista MongoDB:tä varten laajennatte rajapintaa ReactiveMongoRepository.

Tämä rajapinta tarjoaa automaattisesti yleisten operaatioiden reaktiiviset versiot: yksittäiset tulokset palautetaan Mono- ja useat tulokset Flux-oliona.

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

Reaktiivisen tallennuksen simulointi

Kun tallennatte entiteetin reaktiivisen repositorion avulla, se palauttaa Mono<Product>-olion. Tämä Mono edustaa tuotetta sen tallentamisen jälkeen. Tilaamalla sen käynnistätte operaation ja käsittelette tuloksen.

Suorittakaa tämä esimerkki nähdäksenne, miten reaktiivinen tallennusoperaatio voidaan käsitellä:

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.")
    );
  }
}

Reaktiivisen haun simulointi

Datan reaktiivinen hakeminen toimii samalla tavalla. Yksittäistä alkiota (esimerkiksi tunnisteen perusteella) varten saatte Mono-olion. Useita alkioita varten saatte Flux-olion. Tilaamalla nämä julkaisijat kulutatte niiden tuottaman datan.

Suorittakaa tämä koodi nähdäksenne, miten Mono- ja Flux-olioita käytetään haetun datan käsittelyyn:

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

Integrointi reaktiivisiin palveluihin

Spring WebFlux -sovelluksessa palvelukerros injektoi reaktiiviset repositoriot ja käyttää niiden Mono- ja Flux-palautustyyppejä. Näin reaktiivisia operaatioita voidaan ketjuttaa saumattomasti.

Palvelumetodi voi esimerkiksi tallentaa tuotteen ja palauttaa sen jälkeen tallennetun tuotteen tunnisteen kokonaisuudessaan reaktiivisen virran sisällä.

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

Reaktiivisten dataoperaatioiden ketjuttaminen

Reaktiivisen datankäytön todellinen voima tulee esiin operaatioita ketjutettaessa. Tietokannan Mono- ja Flux-virtoja voi muuntaa, suodattaa ja yhdistää muihin reaktiivisiin lähteisiin, kuten ulkoisiin API-kutsuihin tai muun palvelulogiikan tuottamaan dataan.

Näin voitte rakentaa monimutkaisia ja tehokkaita ei-blokkaavia datavirtoja.

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

Pikatesti: reaktiiviset repositoriot

Olette rakentamassa Spring WebFlux -sovellusta, jonka on muodostettava yhteys MongoDB-tietokantaan ei-blokkaavalla tavalla. Mitä Spring Data -rajapintaa repositorion tulee laajentaa, jotta saatte käyttöön reaktiiviset CRUD-operaatiot?

Kertaus: reaktiivinen datankäyttö

Hienoa työtä! Tässä oppitunnissa opitte reaktiivisen datankäytön merkityksestä Spring WebFlux -sovelluksissa ja siitä, miten se toteutetaan.

  • Perinteinen blokkaava datankäyttö korvataan ei-blokkaavilla reaktiivisilla ajureilla.
  • Spring Data tarjoaa reaktiivista CRUD-toiminnallisuutta varten rajapintoja, kuten ReactiveMongoRepository.
  • Nämä repositoriot palauttavat yksittäisiä alkioita varten Mono- ja useita alkioita varten Flux-olioita.
  • Voitte ketjuttaa reaktiivisia operaatioita saumattomasti datankäytöstä muiden reaktiivisten komponenttien kanssa.

Tämä osaaminen on olennaista aidosti päästä päähän reaktiivisten sovellusten rakentamisessa!

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
21
Oppitunnit
84

Usein kysytyt kysymykset

Onko oppitunti ”Reaktiivinen tietojen käyttö ja integrointi” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Spring Boot 4:n kattava opas-oppimispolun 3 oppituntia, myös oppitunnin “Reaktiivinen tietojen käyttö ja integrointi”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Spring Boot 4:n kattava opas-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Reaktiivinen tietojen käyttö ja integrointi”?

Yhdistäkää WebFlux-sovelluksia reaktiivisiin tietovarastoihin ja integroikaa ne muihin reaktiivisiin komponentteihin. Harjoittelet Spring Boot 4:n kattava opas-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Spring Boot 4:n kattava opas-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Boot 4:n kattava opas-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Reaktiivinen tietojen käyttö ja integrointi”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Spring Boot 4:n kattava opas-oppitunnilla?

Kyllä. Jokainen Spring Boot 4:n kattava opas-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Johdatus reaktiiviseen ohjelmointiin
  2. Spring WebFlux ja Reactor Core
  3. Reaktiivinen tietojen käyttö ja integrointi
  4. Reactive Streams -virranhallinta ja virheenkäsittely
← Takaisin: Spring Boot 4:n kattava opas