跟着教程,在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实现的好处:是异步处理,增大吞吐量。