{"id":221,"date":"2024-02-21T21:01:25","date_gmt":"2024-02-21T20:01:25","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=221"},"modified":"2024-02-21T21:01:26","modified_gmt":"2024-02-21T20:01:26","slug":"grundlagen-von-spring-webflux","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=221","title":{"rendered":"Grundlagen von Spring WebFlux"},"content":{"rendered":"\n<p>Spring WebFlux ist ein Teil des Spring Frameworks, der sich auf die Entwicklung reaktiver Anwendungen f\u00fcr das Web konzentriert. Es bietet eine alternative M\u00f6glichkeit zur traditionellen, auf Servlets basierenden Ansatz von Spring MVC, indem es auf dem Reactor-Projekt aufbaut. In diesem Artikel werden die Grundlagen von Spring WebFlux ausf\u00fchrlich erkl\u00e4rt, von den zugrunde liegenden Konzepten bis zur praktischen Anwendung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Einf\u00fchrung in die reaktive Programmierung<\/h2>\n\n\n\n<p>Bevor wir uns in die Details von Spring WebFlux vertiefen, ist es wichtig, das Konzept der reaktiven Programmierung zu verstehen. Reaktive Programmierung zielt darauf ab, asynchrone und ereignisgesteuerte Anwendungen zu entwickeln, die besser auf hohe Last und latenzempfindliche Anforderungen reagieren k\u00f6nnen. Kernkonzepte dabei sind Observable-Streams, Observer-Muster und funktionale Programmierung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Das Reactor-Projekt<\/h2>\n\n\n\n<p>Spring WebFlux basiert auf dem Reactor-Projekt, einer umfassenden Implementierung von reaktiven Programmierparadigmen f\u00fcr Java. Reactor bietet zwei Hauptkomponenten: Mono und Flux. Mono repr\u00e4sentiert einen reaktiven Typ, der null oder ein Element enth\u00e4lt, w\u00e4hrend Flux eine Sequenz von null, einem oder mehreren Elementen darstellt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ Beispiel eines Mono<\/span>\nMono&lt;<span class=\"hljs-built_in\">String<\/span>&gt; mono = Mono.just(<span class=\"hljs-string\">\"Hallo Welt\"<\/span>);\n\n<span class=\"hljs-comment\">\/\/ Beispiel eines Flux<\/span>\nFlux&lt;Integer&gt; flux = Flux.fromIterable(Arrays.asList(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Asynchrone Programmierung in Spring WebFlux<\/h2>\n\n\n\n<p>Spring WebFlux unterst\u00fctzt asynchrone Programmierung durch die Verwendung von Reactor-Typen. Controller-Methoden k\u00f6nnen Mono oder Flux als R\u00fcckgabetypen verwenden, um asynchron Daten zu produzieren. Dies erm\u00f6glicht eine effiziente Ressourcennutzung und verbesserte Skalierbarkeit.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@RestController\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BeispielController<\/span> <\/span>{\n\n    @GetMapping(<span class=\"hljs-string\">\"\/mono\"<\/span>)\n    <span class=\"hljs-keyword\">public<\/span> Mono&lt;String&gt; getMono() {\n        <span class=\"hljs-keyword\">return<\/span> Mono.just(<span class=\"hljs-string\">\"Mono Beispiel\"<\/span>);\n    }\n\n    @GetMapping(<span class=\"hljs-string\">\"\/flux\"<\/span>)\n    <span class=\"hljs-keyword\">public<\/span> Flux&lt;Integer&gt; getFlux() {\n        <span class=\"hljs-keyword\">return<\/span> Flux.fromIterable(Arrays.asList(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Router und Handler in Spring WebFlux<\/h2>\n\n\n\n<p>Im Gegensatz zu Spring MVC, das auf Annotationen basiert, verwendet Spring WebFlux einen funktionalen Ansatz f\u00fcr die Definition von Endpunkten. Dies geschieht durch die Kombination von <code>RouterFunctions<\/code> und <code>HandlerFunctions<\/code>. Der Router ist f\u00fcr die Routenkonfiguration verantwortlich, w\u00e4hrend der Handler die eigentliche Verarbeitung der Anfragen \u00fcbernimmt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Configuration\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RouterConfig<\/span> <\/span>{\n\n    @Bean\n    public RouterFunction&lt;ServerResponse&gt; route(BeispielHandler handler) {\n        <span class=\"hljs-keyword\">return<\/span> RouterFunctions\n                .route(GET(<span class=\"hljs-string\">\"\/api\/beispiel\"<\/span>), <span class=\"hljs-attr\">handler<\/span>::handleBeispiel)\n                .andRoute(GET(<span class=\"hljs-string\">\"\/api\/beispiel\/{id}\"<\/span>), <span class=\"hljs-attr\">handler<\/span>::handleBeispielById);\n    }\n}\n\n@Component\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BeispielHandler<\/span> <\/span>{\n\n    public Mono&lt;ServerResponse&gt; handleBeispiel(ServerRequest request) {\n        <span class=\"hljs-keyword\">return<\/span> ServerResponse.ok().body(Mono.just(<span class=\"hljs-string\">\"Beispiel Daten\"<\/span>), <span class=\"hljs-built_in\">String<\/span>.class);\n    }\n\n    public Mono&lt;ServerResponse&gt; handleBeispielById(ServerRequest request) {\n        <span class=\"hljs-built_in\">String<\/span> id = request.pathVariable(<span class=\"hljs-string\">\"id\"<\/span>);\n        <span class=\"hljs-comment\">\/\/ Logik zur Datenabfrage mit der ID<\/span>\n        <span class=\"hljs-keyword\">return<\/span> ServerResponse.ok().body(Mono.just(<span class=\"hljs-string\">\"Daten mit ID \"<\/span> + id), <span class=\"hljs-built_in\">String<\/span>.class);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5. Funktionale Endpunkte und Annotationen<\/h2>\n\n\n\n<p>Spring WebFlux erm\u00f6glicht auch die Verwendung von funktionalen Endpunkten und Annotationen. Funktionale Endpunkte bieten eine kompaktere M\u00f6glichkeit, Routen und Handler zu definieren, w\u00e4hrend Annotationen eine Mischung aus funktionaler und traditioneller, annotierter Programmierung erm\u00f6glichen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@RestController\n@RequestMapping(<span class=\"hljs-string\">\"\/annotiert\"<\/span>)\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BeispielAnnotiertController<\/span> <\/span>{\n\n    @GetMapping(<span class=\"hljs-string\">\"\/mono\"<\/span>)\n    <span class=\"hljs-keyword\">public<\/span> Mono&lt;String&gt; getMono() {\n        <span class=\"hljs-keyword\">return<\/span> Mono.just(<span class=\"hljs-string\">\"Mono Beispiel\"<\/span>);\n    }\n\n    @GetMapping(<span class=\"hljs-string\">\"\/flux\"<\/span>)\n    <span class=\"hljs-keyword\">public<\/span> Flux&lt;Integer&gt; getFlux() {\n        <span class=\"hljs-keyword\">return<\/span> Flux.fromIterable(Arrays.asList(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">6. WebSockets und reaktive APIs<\/h2>\n\n\n\n<p>Spring WebFlux unterst\u00fctzt auch WebSockets f\u00fcr bidirektionale Kommunikation in Echtzeit. Dies ist besonders n\u00fctzlich f\u00fcr Anwendungen, die eine kontinuierliche Aktualisierung der Benutzeroberfl\u00e4che erfordern. Durch die Kombination von WebFlux und WebSockets k\u00f6nnen reaktive APIs erstellt werden, die auf Ereignisse in Echtzeit reagieren.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Configuration\n@EnableWebSocket\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WebSocketConfig<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">WebSocketConfigurer<\/span> <\/span>{\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {\n        registry.addHandler(<span class=\"hljs-keyword\">new<\/span> BeispielWebSocketHandler(), <span class=\"hljs-string\">\"\/websocket\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BeispielWebSocketHandler<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">TextWebSocketHandler<\/span> <\/span>{\n\n    @Override\n    <span class=\"hljs-keyword\">protected<\/span> void handleTextMessage(WebSocketSession session, TextMessage message) throws <span class=\"hljs-keyword\">Exception<\/span> {\n        <span class=\"hljs-comment\">\/\/ Verarbeitung der empfangenen Nachricht<\/span>\n        String payload = message.getPayload();\n        <span class=\"hljs-comment\">\/\/ Logik f\u00fcr die Verarbeitung der Nachricht<\/span>\n        session.sendMessage(<span class=\"hljs-keyword\">new<\/span> TextMessage(<span class=\"hljs-string\">\"Antwort: \"<\/span> + payload));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">7. Testing in Spring WebFlux<\/h2>\n\n\n\n<p>Das Testen reaktiver Anwendungen in Spring WebFlux ist ebenfalls wichtig. Das Framework bietet spezielle Unterst\u00fctzung f\u00fcr das Testen von reaktiven Komponenten. Sie k\u00f6nnen den <code>WebTestClient<\/code> verwenden, um Ihre Endpunkte zu testen und sicherzustellen, dass sie wie erwartet reagieren.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@SpringBootTest\n@AutoConfigureWebTestClient\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BeispielControllerTest<\/span> <\/span>{\n\n    @Autowired\n    private WebTestClient webTestClient;\n\n    @Test\n    public <span class=\"hljs-keyword\">void<\/span> testGetMono() {\n        webTestClient.get().uri(<span class=\"hljs-string\">\"\/mono\"<\/span>)\n                .exchange()\n                .expectStatus().isOk()\n                .expectBody(<span class=\"hljs-built_in\">String<\/span>.class).isEqualTo(<span class=\"hljs-string\">\"Mono Beispiel\"<\/span>);\n    }\n\n    @Test\n    public <span class=\"hljs-keyword\">void<\/span> testGetFlux() {\n        webTestClient.get().uri(<span class=\"hljs-string\">\"\/flux\"<\/span>)\n                .exchange()\n                .expectStatus().isOk()\n                .expectBodyList(Integer.class).isEqualTo(Arrays.asList(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">8. Fazit<\/h2>\n\n\n\n<p>Spring WebFlux bietet eine leistungsstarke und flexible M\u00f6glichkeit zur Entwicklung reaktiver Webanwendungen in Java. Durch die Integration von Reactor und die Unterst\u00fctzung verschiedener Programmiermodelle erm\u00f6glicht es die effiziente Bew\u00e4ltigung von anspruchsvollen Anwendungsszenarien. Die Verwendung von funktionalen Endpunkten, Annotationen und WebSockets erweitert die Bandbreite der Anwendungsf\u00e4lle, die mit Spring WebFlux umgesetzt werden k\u00f6nnen. Mit umfassender Testunterst\u00fctzung ist es m\u00f6glich, die Robustheit und Zuverl\u00e4ssigkeit Ihrer Anwendungen sicherzustellen. Spring WebFlux ist somit eine wertvolle Erg\u00e4nzung zum Spring-Framework f\u00fcr moderne, reaktive Webentwicklung.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spring WebFlux ist ein Teil des Spring Frameworks, der sich auf die Entwicklung reaktiver Anwendungen f\u00fcr das Web konzentriert. Es bietet eine alternative M\u00f6glichkeit zur traditionellen, auf Servlets basierenden Ansatz von Spring MVC, indem es auf dem Reactor-Projekt aufbaut. In diesem Artikel werden die Grundlagen von Spring WebFlux ausf\u00fchrlich erkl\u00e4rt, von den zugrunde liegenden Konzepten [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-221","post","type-post","status-publish","format-standard","hentry","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=221"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/221\/revisions"}],"predecessor-version":[{"id":222,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/221\/revisions\/222"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}