Java之Spring5:框架新功能

新功能

  1. Spring5框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除。
  2. Spring5框架自带了通用的日志封装。
  3. Spring5框架核心容器支持@Nullable注解。
  4. Spring5核心容器支持函数式风格GenericApplicationContext。
  5. Spring5支持整合JUnit5。

整合Log4j2日志工具

    Spring5已经移除Log4jConfigListener,官方建议使用Log4j2,整合步骤:

  1. 引入相关jar包
    在这里插入图片描述
  2. 创建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注解可以使用在方法上面,属性上面,参数上面,表示方法返回可以为空,属性值可以为空,参数值可以为空。

  1. 用在方法上:
    在这里插入图片描述
  2. 用在参数上
    在这里插入图片描述
  3. 用在属性上
    在这里插入图片描述

函数式风格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

  1. 引入依赖
    在这里插入图片描述
  2. 创建测试类
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

  1. 引入JUnit5依赖
    在这里插入图片描述
  2. 创建测试类
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再补充…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值