Spring Webflux入門
Spring Boot現在採用了反應式程式設計(響應式Reactive),它是一種非阻塞的非同步應用程式和事件驅動程式設計。Spring Framework在內部使用Reactor支援這種Reactive支援,Reactor是一個Reactive Streams實現,它進一步擴充套件了Publisher模型Flux和Mono。
讓我們開始建立一個新的Spring Boot專案,將Webflux,Mongo Reactive和Lombok作為依賴項。
spring init --dependencies=webflux,data-mongodb-reactive,lombok --build=gradle --language=java reactive-webflux-workshop
現在讓我們建立一個簡單的POJO來儲存和檢索MongoDB中的資訊:
@Data @Document @AllArgsConstructor <b>public</b> <b>class</b> Person { @Id <b>private</b> String uuid; <b>private</b> String nickname; <b>private</b> String email; }
Lombok的@Data註釋生成getter和setter方法,toString(),equals(),hashcode()併為每個物件建立一個建構函式。
Spring Data現在支援MongoDB,Couchbase,Redis和Casandra的全面反應體驗,在這種情況下,讓我們建立一個PersonRepository實現ReactiveMongoRepository:
<b>import</b> org.springframework.data.mongodb.repository.ReactiveMongoRepository; <b>import</b> reactor.core.publisher.Flux; <b>import</b> com.jos.dem.webflux.model.Person; <b>public</b> <b>interface</b> PersonRepository <b>extends</b> ReactiveMongoRepository<Person, String> {}
我們將CommandLineRunner用於啟動我們的工作流程。這CommandLineRunner是Spring Boot中的回撥介面,當Spring Boot啟動時會傳入args呼叫其run()方法 :
@SpringBootApplication <b>public</b> <b>class</b> PersonApplication { <b>public</b> <b>static</b> <b>void</b> main(String[] args) { SpringApplication.run(PersonApplication.<b>class</b>, args); } @Bean CommandLineRunner start(){ <b>return</b> args -> { System.out.println(<font>"Hello World!"</font><font>); }; } } </font>
進一步定製start方法:建立人員列表並將其儲存在MongoDB中:
@Bean CommandLineRunner start(PersonRepository personRepository){ <b>return</b> args -> { Stream.of(<font>"josdem"</font><font>, </font><font>"tgrip"</font><font>, </font><font>"edzero"</font><font>, </font><font>"skuarch"</font><font>, </font><font>"siedrix"</font><font>) .map(nickname -> <b>new</b> Person(UUID.randomUUID().toString(), nickname, nickname + </font><font>"@email.com"</font><font>)) .forEach(person -> personRepository.save(person).subscribe()); }; } </font>
重要資訊:在上面函式運算子中實現的邏輯僅在資料開始流動時執行,也就是直到使用subscribe()方法才會執行。
現在我們將Person物件儲存到MongoDB,讓我們新增一些程式碼來清理我們的資料庫,插入和顯示人員。
@Bean CommandLineRunner start(PersonRepository personRepository){ <b>return</b> args -> { personRepository.deleteAll().subscribe(); Stream.of(<font>"josdem"</font><font>, </font><font>"tgrip"</font><font>, </font><font>"edzero"</font><font>, </font><font>"skuarch"</font><font>, </font><font>"siedrix"</font><font>) .map(nickname -> <b>new</b> Person(UUID.randomUUID().toString(), nickname, nickname + </font><font>"@email.com"</font><font>)) .forEach(person -> personRepository.save(person).subscribe()); personRepository.findAll().log().subscribe(System.out::println); }; } </font>
為了執行這個例子,你需要在MongoDB中建立一個數據庫authorization: "enabled"。另外,不要忘記將MongoDB憑據資訊新增到您的application.properties檔案中:
spring.data.mongodb.database=reactive_webflux
spring.data.mongodb.host=localhost
spring.data.mongodb.username=username
spring.data.mongodb.password=password
要瀏覽專案,請轉到ofollow,noindex" target="_blank">此處 下載專案。