跟著教程,在spring initializr上面建了一demo。
Spring initializr 是Spring 官方提供的一個很好的工具,用來初始化一個Spring boot 的專案。
建完以後發現結構是這樣子的,跟東哥的sunrise是有相似的結構,他應該也是通過這個初始化的專案,我個人理解是通過這個來選擇你想要的元件他會自動幫你下載好相應的jar包。
寫了一個dao層:user類
idea中生成set get方法的快捷鍵是alt+insert。
新建一個Repository包(倉儲):具體這個層有什麼用還不是很清楚,待補充。
@Repository:用於標註資料訪問元件,即DAO元件。
@link:javadoc文件,可以把你的寫的註釋生成api檔案,這個link就可以連線到你想要連結的檔案裡面去,譬如這裡是連結到User這個model裡面。
controller層:
package com.kim.firstappdemo.controller;
import com.kim.firstappdemo.domain.User;
import com.kim.firstappdemo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository){
this.userRepository = userRepository;
}
@PostMapping("/person/save")
public User save(@RequestParam String name){
User user = new User();
user.setName(name);
if(userRepository.save(user)){
System.out.printf("使用者物件: % 儲存成功!\n",user);
}
return user;
}
}
複製程式碼
然後Debug
這裡打了斷點:
因為寫的是post請求,之前我想起來我寫ssm,用的都是ajax來傳送post請求,這裡不用麻煩,下載了一個軟體:postman。
把url寫進去,然後設定是post,然後設定params,send就能傳送請求。
debug沒有問題。
新建config包 新建RouteFunctionConfiguration:
從名字上來看,這是路由方法配置,應該跟我之前寫過得路由配置差不多。
package com.kim.firstappdemo.config;
import com.kim.firstappdemo.domain.User;
import com.kim.firstappdemo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import java.util.Collection;
/**
* 路由器函式 設定
*/
@Configuration
public class RouteFunctionConfiguration {
/**
* Servlet
* 請求介面:ServletRequest 或者 HttpServletRequest
* 響應介面:ServletRequest 或者 HttpServletRequest
* Spring 5.0 重新定義了服務請求和響應介面
* 即可支援 Servlet 規範,也可以支援自定義 比如 Netty (Web Server)
* 以本例:
* 定義 GET 請求,並且返回所有使用者物件 URI :/person/find/all
*
* Flux 是 0 - N 個物件的集合
* Mono 是 0 - 1 個物件的集合
* Reactive 中的 Flux 或者 Mono 他是非同步處理(非阻塞)
* 集合物件基本上是同步處理(阻塞)
* Flux 或則 Mono 都是 Publisher(釋出者)
*/
@Bean
@Autowired
public RouterFunction<ServerResponse> personFindAll(UserRepository userRepository){
return RouterFunctions.route(RequestPredicates.GET("/person/find/all"),
serverRequest -> {
// 返回所有使用者物件
Collection<User> users = userRepository.findAll();
Flux<User> userFlux = Flux.fromIterable(users);
return ServerResponse.ok().body(userFlux,User.class);
});
}
}
複製程式碼
呼叫倉儲repository裡面的findAll方法放在一個collection集合裡面,通過迭代方法放進Flux集合裡面,然後再返回。
.ok()就是有資料是返回的一個狀態
然後開debug,用postman發請求:
返回的結果沒有問題。
用Reactive實現的好處:是非同步處理,增大吞吐量。