上一篇文章中已经学习到了我们的Spring事务问题,在更早些的文章中已经学习到我们的Spring的AOP,IOC,DI,整合JDBCTemplate等一系列问题的学习,本篇文章也是Spring框架的最后一篇,学习关于我们的Spring5的一些新特性。
一、大致介绍
- 整个Spring5框架的代码基于java8,运行兼容JDK9,许多建议不适用的类,都做了删除。
1、Spring5新功能之整合日志框架
(1)介绍
- Spring5框架自带了通用的日志功能
- Spring已经移除了Log4jConfigListener,官方建议使用Log4j版本2,如果你要使用的话,那就降低Spring版本。
(2)引入练习
-
导入jar包
-
创建log4j2.xml文件,不能创建其他的文件名称
level等级越往右边,优先级越高,它就会显示前面的几个 -
试一试效果
- 如果改为debug的话就会显示更多
- 如果改为debug的话就会显示更多
-
如果需要在控制台在控制台进行输出的话,就如下配置
2、Spring新功能Nullable注解和函数式注册对象
(1)Spring核心容器支持@Nullable注解
- @Nullable注解可以使用在方法,属性,或者参数上面,表示方法返回值可以为空,用在属性上,表示可以为空,如果在参数上表示参数可以为空,如果不加注解,有时候可能会报错。
- 用在方法上,表示方法返回值可以为空
- 加在参数上:表示参数可以为空
- 加载属性上面:表示该属性可以为空
- 用在方法上,表示方法返回值可以为空
(2)Spring核心容器里面支持函数式GenericApplicationContext
- 首先要创建GenericApplicationContext对象
- 调用方法对对象进行注册,refresh方法
- 注册过程:调用registerBean方法进行配置
- 获取在spring里面注册的对象getBean(“类的全路径”)
3、Spring5整合JUnit5测试
(1)先看JUnit4整合的情况
- 首先导入jar包
我们之前都是要在Test方法里面,编写我们的代码如下,但是现在只要添加注解即可了,不用在麻哩麻饭的去写这么多。
可以直接使用Autowire的注解注入即可。
(2)整合JUnit5整合的情况
-
同样的要先导入jar包,是导入Junit5的jar包
-
然后创建测试类
-
采用符合注解
4、Spring5新功能WebFulx
(1)WebFulx基本介绍
- 什么是WebFulx
- 是Spring5添加的新模块,用于web开发的,功能SpringMvc类似,Webflux使用当前流行的响应式编程出现的框架。
- 传统的web框架,比如SpringMVC,这些都是基于Servlet容器来实现的,Webflux是一种异步非阻塞的框架,异步非阻塞的框架在Servlet3.1以后才支持,核心是基于Reactor的相关API实现的,但是同时它也支持Servlet
- 什么是异步:同步异步其实就是针对的是调用者,你在吃饭,然后准备去打球,要给辅导员请假,同步就是你必须等到它同意,而且异步就是可以说了就去打球了,其他的不管。
- 什么是非阻塞是针对对象的:A是调用者,B是被调用者,B得到一个被调用,直接给他反馈,这就是非阻塞,不反馈就是阻塞。
- WebFlux的优势:第一步非阻塞(有限的资源下可以提高吞吐量和伸缩性,以Reactor实现的响应式编程),Spring5框架基于Java8,WebFlux使用Java8函数式编程方式实现路由请求(学过Vue框架的应该很好理解)
- 与SpringMVC的比较:
都可以使用注解方式,都运行在Tomcat等容器中,SpringMvc采用命令式编程,这样写更容易理解,而WebFlux采用异步响应式编程。建议:如果远程服务调用的话,就建议采用WebFlux,其实他们两很多相同的。像网关处理这些地方就建议使用。
(2)响应式编程
-
什么是响应式编程:“响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
-
Java8及之前版本:提供了Observer和Observalbe两个类通过观察者模式,学过Vue框架的话,其实感觉和数据的双向绑定差不多的概念。你另外一个表格里面的数据变化了,则这个表格的数据也要变化。
- 执行发现什么都没有
- 再次修改
- 其实Spring底层是没有才用java8的两个类实现的,而是才用的Java9内的个类来实现的FLow(主要有两个方法,订阅和发布方法)来实现的
- 执行发现什么都没有
-
Reactor实现响应式编程【这种都是要满足一种规范Reactive规范,而我们的Reactor就是实现了Reactive规范的】
- 两个核心类之一:Mono和Flux,都实现了Publisher接口,提供了丰富的操作符。
- Flux能实现发布者,返回N个元素
- Mono实现翻发布者,返回0或者1个元素。
- Flux和Mono都是数据流的发布者,使用Flux和Mono都是可以发出三种数据信号,元素值,错误信号,完成信号,错误信号和完成信号都是代表终止信号,终止信号用于告诉订阅者数据流结束了,错误信号也终止信号,吧错误信息返回给用户。
- 两个核心类之一:Mono和Flux,都实现了Publisher接口,提供了丰富的操作符。
-
项目练习,以后的项目都是采用Maven来完成项目的包管理
- 引入依赖
- 三种信号中,错误和完成信号都是终止信号,不能共存的,如果没有发送任何元素值,而是直接发送错误或者完成信号,表示空数据流,如果没有错误信号,
- 进行订阅,没有订阅什么都不会发生的
- 引入依赖
-
操作符:对数据流进行一道道的操作,就是操作符,比如工厂的流水线中的一个个工人。
- 第一常见的map 元素映射为新元素。
- 第二个常见的flatMap 把元素映射为流。把每个元素转为流,把全部流合并一个大流,然后发送
- 第一常见的map 元素映射为新元素。
(3)WebFlux执行流程和核心
SpringWebFlux基于Reactor,默认使用容器是Netty,netty是高性能的NIO框架,异步非阻塞的框架
(3.1)Netty
- BIO:每次都要建立一个线程,都要进行阻塞进行处理
- netty是采用NIO的异步非阻塞的
(3.2)WebFlux执行过程
执行过程和SpringMVC过程是很相似的。
- 核心控制器:是采用核心控制器DispatchHandler,实现接口WebHandler
- 核心控制器:它主要是负责请求的处理
- HandlerMapping:根据请求找出请求方法
- HandlerAdapter:适配器,负责请求处理
- HandlerResultHandler :负责响应结果进行处理
(3.3)核心API
有两个核心的接口
- RouterFunction:路由功能,将路由请求转发给对应的方法
- HandlerFunction:处理对应的函数。
(4)SpringWebFlux基于注解形式编程
和springmvc非常相似的,只需要把相关依赖配置到项目中,SpringBoot自动配置相关容器,默认情况使用Netty服务器。
-
这里创建SpringBoot项目
-
配置启动的端口号
-
创建实体类
-
SpringMvc是采用Servlet,Tomcat,
(5)SpringWebFLux基于函数式编程模型
-
在使用函数式编程模型操作时候,需要自初始化服务器
-
基于函数式编程模型时,有两个核心接口,RouterFunction(实现路由功能,请求转发给对应的Handler)和HandlerFunction(处理请求生成响应的函数),核心任务定义两个函数式接口的实现并且启动需要的服务器。
-
SpringWebFlux请求和响应不再是ServletRequest和ServletResponse,而是ServerRequest和ServerResponse
-
之前的除了Controller删除以外,其他的都不变。吧Controller改为Handler
-
初始化服务器,编写Router
- 编写路由
- 创建服务器
- 编写路由
-
端口号是生成的。
(6)WebClient实现调用