1. Spring 5 框架新功能
- 整个Spring 5 框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除。
- Spring 5.0 框架自带了通用的日志封装
(1)Spring 5 已经移除 Log4jConfigListener,官方建议使用Log4j2(如果要用之前的Log4j版本,需要将Spring 降到4或以下版本)
Apache 的 Log4j2 是对Log4J 的升级版本,参考了logback 的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:
- 异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
- 性能提升,log4j2 相较于log4j 和 logback 都具有明显的性能提升,有18倍性能提升,后面会有官方测试的数据。
- 自动重载配置,参考了logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用。
- 无垃圾机制,log4j2 在大部分情况下,都可以使用其设计的一套无垃圾机制【对象重用、内存缓冲】,避免频繁的日志收集导致的 jvm gc。
- 目前市面上最主流的日志门面就是SLF4J,虽然Log4j2 也是日志门面,因为它的日志实现功能非常强大,性能优越。所以大家一般还是将 Log4j2 看作是日志的实现,Slf4j + Log4j2 应该是未来的大势所趋。
(2)Spring 5 框架整合Log4j2:
2. Spring 5 框架整合Log4j2
第一步:引入Jar包
Log4j2包下载地址:Apache Logging Services
点击上面链接下载zip文件后解压,从中挑出如下Jar包:
Slf4j 包下载地址:Central Repository: org/slf4j/slf4j-api
选择对应版本下载:
最终Spring 5 需要整合的4个日志的Jar包如下:
然后,引入到项目中:
第二步:创建log4j2.xml 配置文件
- 注意这个配置文件的文件名称是固定的,不要用别的名字。
<?xml version="1.0" encoding="UTF-8" ?> <!--日志级别以及优先级排序:OFF 》 FATAL 》 WARN 》 INFO 》 DEBUG 》 TRACE 》 ALL--> <!--configuration 后面的status用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,可以看到log4j2内部的各种详细输出--> <configuration status="INFO"> <!--先定义所有的appender--> <appenders> <!--输出日志信息到控制台--> <console name="Console" target="SYSTEM_OUT"> <!--控制日志的输出格式--> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss. SSS} [%t] %-5level %logger{36} - %msg%n"/> </console> </appenders> <!--然后定义logger,只有定义logger并引入appender,appender才会生效--> <!--root:用于指定项目的根日志,如果没有单独指定Logger,则会使用root作为默认的日志输出--> <loggers> <root level="info"> <appender-ref ref="Console"/> </root> </loggers> </configuration> |
直接运行之前的某一个例子测试日志:
将配置文件中的INFO级别改成DEBUG级别,然后测试输出如下:
测试手动输出Log日志:
3. Spring 5 框架支持@Nullable注解
(1)@Nullable 注解可以使用在方法上面、属性上面 和 参数上面, 表示方法返回值可以为空、属性值可以为空、参数值可以为空。
4. Spring 5 支持函数式注册对象
- Spring 5 核心容器支持函数式风格GenericApplicationContext
例子:
或者指定Bean的名称:
5. Spring 5 支持整合 JUnit5
(1)整合JUnit4
第一步:引入Spring相关针对测试的依赖
第二步:创建测试类,使用注解方式完成(这里用到前面的log4j2.xml 配置文件)。
(2)Spring 5 整合JUnit5
第一步:引入JUnit5 的Jar包(直接在IDEA中切换引入)
- 注释掉 Test 注解的import包,然后重新import class 中选择 ”Add‘JUnit 5 ...’...“,进行引入:
引入完后,可以看到:
第二步:创建测试类,使用注解完成
也可以使用一个复合的注解代替上面的两个注解,如下:
6. Spring 5 框架新功能(Webflux)
- Webflux 的前置知识包括: SpringMVC、SpringBoot、Maven、Java8新特性
- SpringWebflux介绍
(1)是Spring5添加的新模块,用于Web开发的,功能与SpringMVC类似的,Webflux使用当前一种比较流行的响应式编程出现的框架。
(2)使用传统的web框架,比如SpringMVC,这些基于Servlet容器,Webflux是一种异步非阻塞的框架,异步非阻塞的框架在Servlet3.1以后才支持,核心是基于Reactor的相应API实现的。
(3)什么是异步非阻塞?
- 异步和同步:针对调用者而言,调用者发送请求,如果等着对方回应之后才去做其他事情就是同步;如果发送请求之后不等着对方回应就取做其他事情就是异步。
- 非阻塞和阻塞:针对被调用者而言,被调用者收到请求之后,做完请求任务之后才去做其他事情就是阻塞,收到请求之后马上给出反馈但继续做原来的事情,完成后再去做请求的事情就是非阻塞。
(4)Webflux特点:
- 非阻塞:在有限的资源下,提高系统吞吐量和伸缩性,以Reator为基础实现响应式编程
- 函数式编程:Spring 5 框架基于java8,Webflux使用java8函数式编程方式实现路由请求
(5)比较SpringMVC和Webflux
- 两个框架都可以使用注解方式,都运行在Tomcat等容器中
- SpringMVC采用命令式编程,Webflux采用异步响应式编程
- 比如微服务网关就是可以用Webflux,更加方便(有限资源处理更多操作)