Springboot3新特性:函数式Web编程方式

springboot3springMVC5.2以后允许我们使用函数式的方式编程,定义Web的请求处理流程。

Web请求处理的方式
1.@Controller+@RequestMapping :耦合式(路由、业务耦合)
2.函数式web:分离式(路由、业务分离)

1.场景

场景:User RESTful - CRUD

  • GET /user/1 获取1号用户
  • GET /users 获取所有用户
  • POST /user 请求体携带JSON,新增一个用户
  • PUT /user/1 请求体携带JSON,修改1号用户
  • DELETE /user/1 删除1号用户

2.核心类

  • RouterFunction:给容器中放一个Bean:类型是RouterFunction
  • RequestPredicate:定义请求:请求谓语。请求方式(GET、POST)、请求参数
  • ServerRequest:封装请求完整数据
  • ServerResponse:封装响应完整数据

3.实例

首先定义了一个实体类Person

@Data
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement
public class Person {
    Long id;
    String username;
    String email;
    int age;

}

然后定义一个配置类

@Configuration
public class WebFunctionConfig {
    /**
     * 函数式Web:
     * 1、给容器中放一个Bean:类型是RouterFunction<ServerResponse>
     * 2、RequestPredicate:定义请求:请求谓语。请求方式(GET、POST)、请求参数
     * 3、ServerRequest:封装请求完整数据
     * 4、ServerResponse:封装相应完整数据
     * */

    @Bean
    public RouterFunction<ServerResponse> userRoute(UserBizHandler userBizHandler /*这个会被自动注入进来*/){
        return RouterFunctions.route()//开始定义路由信息
                .GET("/user/{id}", RequestPredicates.accept(MediaType.ALL),userBizHandler::getUser)
                .GET("/users",userBizHandler::getUsers)
                .POST("/user",RequestPredicates.accept(MediaType.ALL),userBizHandler::addUser)
                .PUT("/user/{id}",RequestPredicates.accept(MediaType.ALL),userBizHandler::updateUser)
                .DELETE("/user/{id}",userBizHandler::deleteUser)
                .build();

    }
}

最后可以写上处理器类

@Service
@Slf4j
public class UserBizHandler {

    /**
     * 查询指定id的用户
     * */
    public ServerResponse getUser(ServerRequest request){
        log.info("查询【{}】用户信息",request.pathVariable("id"));
        //业务处理
        Person person = new Person(1L,"张三1","zs1@qq.com",15);
        //构造响应
        return ServerResponse.ok().body(person);
    }

    /**
     * 查询多个id的用户
     * 1*/
    public ServerResponse getUsers(ServerRequest request){
        log.info("查询所有用户信息");
        List<Person> list = Arrays.asList(new Person(1L, "张三1", "zs1@qq.com", 15),
                new Person(2L, "张三2", "zs2@qq.com", 16));
        return ServerResponse.ok().body(list);
    }

    /**
     * 添加用户
     * */
    public ServerResponse addUser(ServerRequest request) throws ServletException, IOException {
        Person body = request.body(Person.class);
        log.info("保存用户信息:{}",body);
        return ServerResponse.ok().build();
    }

    /**
     * 修改用户信息
     * */
    public ServerResponse updateUser(ServerRequest request) throws ServletException, IOException {
        Person body = request.body(Person.class);
        log.info("修改用户信息后:{}",body);
        return ServerResponse.ok().build();
    }

    /**
     * 删除用户信息
     * */
    public ServerResponse deleteUser(ServerRequest request){
        log.info("删除用户【{}】信息",request.pathVariable("id"));
        return ServerResponse.ok().build();
    }
}

后面可以通过Postman进行测试
测试GET
image.png
image.png
测试POST
image.png
测试PUT
image.png
测试DELETE
image.png

总结

虽然还是觉得最开始的controller、service这些业务逻辑更清晰一点,但是可能后续的开发规则有改变,学习一下官方给的新特性更好的适应现在的内卷开发环境,所以以后可以试一试这种开发方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值