一 domain层
package com.imooc.firstappdemo.domain;
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
二 repsitory层
package com.imooc.firstappdemo.repository;
import com.imooc.firstappdemo.domain.User;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
@Repository
public class UserRepository {
private final ConcurrentMap<Integer,User> repository = new ConcurrentHashMap<>();
private final static AtomicInteger idGenerator= new AtomicInteger();
public boolean save(User user){
//ID从1开始
Integer id=idGenerator.incrementAndGet();
user.setId(id);
return repository.put(id,user)==null;
}
public Collection<User> findAll(){
return repository.values();
}
}
三 controller层
package com.imooc.firstappdemo.controller;
import com.imooc.firstappdemo.domain.User;
import com.imooc.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("用户对象:%s 保存成功 \n",user);
}
return user;
}
}
四 路由器函数
package com.imooc.firstappdemo.config;
import com.imooc.firstappdemo.domain.User;
import com.imooc.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 reactor.core.publisher.Mono;
import java.util.Collection;
/**
* 路由器函数 配置
* */
@Configuration
public class RouterFunctionConfiguration {
/**
* Servlet
* 请求接口:ServletRequest或者HttpServletRequest
* 响应接口:ServletResponse或者HttpServletResponse
*Spring 5.0重新定义了服务请求和响应接口
* 请求接口:ServerRequest
* 响应接口:ServerResponse
* 既可以支持Servlet规范,也可以支持自定义,比如Netty这样的规范
* 本例
* 定义Get请求,并且返回所有用户对象URI:/person/find/all
* Flux是0-N个对象
* Mono是0-1个对象
* Reactive中的Flux和Mono是异步处理(非阻塞)
* 集合对象基本是同步处理(阻塞)
* Flux或者Mono都是发布器
*/
@Bean
@Autowired
public RouterFunction<ServerResponse> personFindAll(UserRepository userRepository){
return RouterFunctions.route(RequestPredicates.GET("/person/find/all"),
request ->{
//返回所有的用户对对象
Collection<User> users= userRepository.findAll();
Flux<User> userFlux = Flux.fromIterable(users);
return ServerResponse.ok().body(userFlux,User.class);
});
}
}
五 测试
![](https://i-blog.csdnimg.cn/blog_migrate/e4d5f773fc157458aee19b366582d68c.png)
六 参考