WebFlux
WebFlux是Spring推出响应式编程的一部分(web端),响应式编程是异步非阻塞的,一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式。
参考:WebFlux,基于Reactive Streams响应式编程
代码案例
pom.xml
<!-- 统一版本配置 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-boot.version>2.3.9.RELEASE</spring-boot.version>
</properties>
<!-- 声明SpringBoot依赖版本 -->
<dependencyManagement>
<dependencies>
<!--spring-boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
controller类:
package com.what21.demo.controller;
import com.what21.demo.handler.IUserHandler;
import com.what21.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private IUserHandler userHandler;
@GetMapping()
public Flux<User> findAllUser() {
return userHandler.findUsers();
}
@GetMapping(value = "/{id}")
public Mono<User> findUserById(@PathVariable("id") Long id) {
return userHandler.findUserById(id);
}
@PostMapping()
public Mono<Long> saveUser(@RequestBody User city) {
return userHandler.saveUser(city);
}
@PutMapping()
public Mono<Long> modifyUser(@RequestBody User city) {
return userHandler.modifyUser(city);
}
@DeleteMapping(value = "/{id}")
public Mono<Long> deleteUser(@PathVariable("id") Long id) {
return userHandler.deleteUser(id);
}
}
model类:
package com.what21.demo.model;
import lombok.Data;
@Data
public class User {
// ID
private Long id;
// 登录名
private String username;
// 姓名
private String name;
// 描述
private String description;
}
handler
package com.what21.demo.handler;
import com.what21.demo.model.User;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface IUserHandler {
// 查找所有
Flux<User> findUsers();
// 查找单个
Mono<User> findUserById(Long id);
// 保存操作
Mono<Long> saveUser(User city);
// 修改操作
Mono<Long> modifyUser(User city);
// 删除操作
Mono<Long> deleteUser(Long id);
}
package com.what21.demo.handler;
import com.what21.demo.model.User;
import com.what21.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Component
public class UserHandlerImpl implements IUserHandler {
private final UserRepository cityRepository;
@Autowired
public UserHandlerImpl(UserRepository cityRepository) {
this.cityRepository = cityRepository;
}
@Override
public Flux<User> findUsers() {
return Flux.fromIterable(cityRepository.findSubjects());
}
public Mono<User> findUserById(Long id) {
return Mono.justOrEmpty(cityRepository.findSubjectById(id));
}
public Mono<Long> saveUser(User city) {
return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.saveSubject(city)));
}
public Mono<Long> modifyUser(User city) {
return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.updateSubject(city)));
}
public Mono<Long> deleteUser(Long id) {
return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.deleteSubject(id)));
}
}
repository
package com.what21.demo.repository;
import com.what21.demo.model.User;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
@Repository("userRepository")
public class UserRepository {
private ConcurrentMap<Long, User> repositoryMap = new ConcurrentHashMap<>();
private static final AtomicLong idGenerator = new AtomicLong(0);
public UserRepository() {
User user1 = new User();
user1.setId(new Date().getTime());
user1.setUsername("zhangsan");
user1.setName("张三");
user1.setDescription("路人甲");
this.repositoryMap.put(user1.getId(), user1);
User user2 = new User();
user2.setId(new Date().getTime());
user2.setUsername("lisi");
user2.setName("李四");
user2.setDescription("路人乙");
this.repositoryMap.put(user2.getId(), user2);
}
public Collection<User> findSubjects() {
return repositoryMap.values();
}
public User findSubjectById(Long id) {
return repositoryMap.get(id);
}
public Long saveSubject(User city) {
Long id = idGenerator.incrementAndGet();
city.setId(id);
repositoryMap.put(id, city);
return id;
}
public Long updateSubject(User city) {
repositoryMap.put(city.getId(), city);
return city.getId();
}
public Long deleteSubject(Long id) {
repositoryMap.remove(id);
return id;
}
}
启动类:
package com.what21.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
配置
server:
port: 9999
访问:
http://192.168.3.50:9999/user