Spring5框架新功能
新功能
- Spring5框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除。
- Spring5框架自带了通用的日志封装。
- Spring5框架核心容器支持@Nullable注解。
- Spring5核心容器支持函数式风格GenericApplicationContext。
- Spring5支持整合JUnit5。
整合Log4j2日志工具
Spring5已经移除Log4jConfigListener,官方建议使用Log4j2,整合步骤:
- 引入相关jar包
- 创建log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,可以看到log4j2内部各种详细输出-->
<configuration status="DEBUG">
<!--先定义所有的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>
再拿前面的银行转账例子测试一下:
2021-03-15 11:26:21,323 main DEBUG Apache Log4j Core 2.11.2 initializing configuration XmlConfiguration[location=D:\IdeaProjects\Spring5_tx\out\production\Spring5_tx\log4j2.xml]
2021-03-15 11:26:21,331 main DEBUG Installed 1 script engine
2021-03-15 11:26:21,874 main DEBUG Oracle Nashorn version: 1.8.0_261, language: ECMAScript, threading: Not Thread Safe, compile: true, names: [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript], factory class: jdk.nashorn.api.scripting.NashornScriptEngineFactory
2021-03-15 11:26:21,875 main DEBUG PluginManager 'Core' found 117 plugins
2021-03-15 11:26:21,875 main DEBUG PluginManager 'Level' found 0 plugins
2021-03-15 11:26:21,877 main DEBUG PluginManager 'Lookup' found 13 plugins
2021-03-15 11:26:21,879 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout].
2021-03-15 11:26:21,884 main DEBUG PluginManager 'TypeConverter' found 26 plugins
2021-03-15 11:26:21,895 main DEBUG PatternLayout$Builder(pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n", PatternSelector=null, Configuration(D:\IdeaProjects\Spring5_tx\out\production\Spring5_tx\log4j2.xml), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null")
2021-03-15 11:26:21,896 main DEBUG PluginManager 'Converter' found 44 plugins
2021-03-15 11:26:21,905 main DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.ConsoleAppender].
2021-03-15 11:26:21,911 main DEBUG ConsoleAppender$Builder(target="SYSTEM_OUT", follow="null", direct="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout(%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n), name="Console", Configuration(D:\IdeaProjects\Spring5_tx\out\production\Spring5_tx\log4j2.xml), Filter=null, ={})
2021-03-15 11:26:21,913 main DEBUG Starting OutputStreamManager SYSTEM_OUT.false.false
2021-03-15 11:26:21,914 main DEBUG Building Plugin[name=appenders, class=org.apache.logging.log4j.core.config.AppendersPlugin].
2021-03-15 11:26:21,916 main DEBUG createAppenders(={Console})
2021-03-15 11:26:21,917 main DEBUG Building Plugin[name=appender-ref, class=org.apache.logging.log4j.core.config.AppenderRef].
2021-03-15 11:26:21,926 main DEBUG createAppenderRef(ref="Console", level="null", Filter=null)
2021-03-15 11:26:21,926 main DEBUG Building Plugin[name=root, class=org.apache.logging.log4j.core.config.LoggerConfig$RootLogger].
2021-03-15 11:26:21,928 main DEBUG createLogger(additivity="null", level="INFO", includeLocation="null", ={Console}, ={}, Configuration(D:\IdeaProjects\Spring5_tx\out\production\Spring5_tx\log4j2.xml), Filter=null)
2021-03-15 11:26:21,931 main DEBUG Building Plugin[name=loggers, class=org.apache.logging.log4j.core.config.LoggersPlugin].
2021-03-15 11:26:21,932 main DEBUG createLoggers(={root})
2021-03-15 11:26:21,932 main DEBUG Configuration XmlConfiguration[location=D:\IdeaProjects\Spring5_tx\out\production\Spring5_tx\log4j2.xml] initialized
2021-03-15 11:26:21,933 main DEBUG Starting configuration XmlConfiguration[location=D:\IdeaProjects\Spring5_tx\out\production\Spring5_tx\log4j2.xml]
2021-03-15 11:26:21,934 main DEBUG Started configuration XmlConfiguration[location=D:\IdeaProjects\Spring5_tx\out\production\Spring5_tx\log4j2.xml] OK.
2021-03-15 11:26:21,935 main DEBUG Shutting down OutputStreamManager SYSTEM_OUT.false.false-1
2021-03-15 11:26:21,936 main DEBUG Shut down OutputStreamManager SYSTEM_OUT.false.false-1, all resources released: true
2021-03-15 11:26:21,936 main DEBUG Appender DefaultConsole-1 stopped with status true
2021-03-15 11:26:21,937 main DEBUG Stopped org.apache.logging.log4j.core.config.DefaultConfiguration@69ee81fc OK
2021-03-15 11:26:21,976 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2
2021-03-15 11:26:21,978 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=StatusLogger
2021-03-15 11:26:21,979 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=ContextSelector
2021-03-15 11:26:21,980 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=Loggers,name=
2021-03-15 11:26:21,981 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=Appenders,name=Console
2021-03-15 11:26:21,983 main DEBUG org.apache.logging.log4j.core.util.SystemClock does not support precise timestamps.
2021-03-15 11:26:21,984 main DEBUG Reconfiguration complete for context[name=18b4aac2] at URI D:\IdeaProjects\Spring5_tx\out\production\Spring5_tx\log4j2.xml (org.apache.logging.log4j.core.LoggerContext@66ce957f) with optional ClassLoader: null
2021-03-15 11:26:21,984 main DEBUG Shutdown hook enabled. Registering a new one.
2021-03-15 11:26:21,985 main DEBUG LoggerContext[name=18b4aac2, org.apache.logging.log4j.core.LoggerContext@66ce957f] started OK.
2021-03-15 11:26:22.318 [main] INFO com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
java.lang.ArithmeticException: / by zero
......
@Nullable注解
说明:@Nullable注解可以使用在方法上面,属性上面,参数上面,表示方法返回可以为空,属性值可以为空,参数值可以为空。
- 用在方法上:
- 用在参数上
- 用在属性上
函数式风格GenericApplicationContext
Spring5核心容器支持函数式风格GenericApplicationContext,举例:使用函数式风格new一个对象user,然后将他交给Spring进行管理。
User类:
package com.jackma.spring5.test;
public class User {
public static void main(String[] args) {
// 在Spring中自己new的对象,需要在Spring的IOC容器中进行注册,这样这个对象才会交给Spring进行管理
User user = new User();
}
}
注册:
@Test
@Test
public void testGenericApplicationContext() {
// 创建GenericApplicationContext对象
GenericApplicationContext context = new GenericApplicationContext();
// 调用方法来注册对象
context.refresh();
context.registerBean("user1", User.class, () -> new User());
// 获取Spring里注册的对象,两种方法
// 1.全路径
// User user = (User) context.getBean("com.jackma.spring5.test.User");
// 2.在registerBean中指定bean的名称
User user = (User) context.getBean("user1");
System.out.println(user);
}
结果:
整合JUnit5
之前我们在写测试代码的时候都会建一个方法,然后在方法里都需要进行加载配置文件、得到对象等操作,并不是很方便。在Spring5中支持JUnit5框架的整合,可以使代码用注解的方式实现。
整合JUnit4
- 引入依赖
- 创建测试类
package com.jackma.spring5.test;
import com.jackma.spring5.Service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.swing.*;
@RunWith(SpringJUnit4ClassRunner.class) // 单元测试框架
@ContextConfiguration("bean1.xml") // 加载配置文件
public class JTest4 {
@Autowired
private UserService userService;
@Test
public void test(){
userService.accountMoney();
}
}
整合JUnit5
- 引入JUnit5依赖
- 创建测试类
package com.jackma.spring5.test;
import com.jackma.spring5.Service.UserService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:bean1.xml")
public class JTest5 {
@Autowired
private UserService userService;
@Test
public void test(){
userService.accountMoney();
}
}
也可以使用一个复合注解替代上面两个注解@ExtendWith和@ContextConfiguration完成整合:
//@ExtendWith(SpringExtension.class)
//@ContextConfiguration("classpath:bean1.xml")
// 复合注解:@SpringJUnitConfig
@SpringJUnitConfig(locations = "classpath:bean1.xml")
public class JTest5 {
@Autowired
private UserService userService;
@Test
public void test(){
userService.accountMoney();
}
}
SpringWebflux
SpringWebflux是Spring5添加的新模块,用于web开发,功能和SpringMVC类似的,是当前一种比较流程响应式编程出现的框架。
后续学习完SpringMVC再补充…