Spring5框架新功能

概述

  • 1.整个Spring5框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除。
  • 2.Spring5框架自带了通用的日志封装(也可以整合其他日志框架)
  • 3.Spring5中移除了Log4jConfigListener,官方建议使用Log4j2

1. Spring5框架整合Log4j2

1.1导入jar包

在这里插入图片描述

1.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="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>

1.3 运行代码即可看到日志输出

在这里插入图片描述

1.4手动输出日志

package com.atguigu.spring5.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author huxuyang
 * @create 2022-03-02 21:01
 */
public class TestLog {
    
    
    private static final Logger log = LoggerFactory.getLogger(TestLog.class);

    public static void main(String[] args) {
    
    
        log.info("hello log4j2 info....");
        log.warn("log4j2 warn info........");
    }
}

运行结果
在这里插入图片描述

2. Spring5框架核心容器支持@NullAble注解

2.1 @Nullable注解可以使用在方法上面,表示方法返回可以为空

@Nullable
public ClassLoader getClassLoader() {
    
    
    return this.resourceLoader != null && !this.customClassLoader ? this.resourceLoader.getClassLoader() : super.getClassLoader();
}

2.2 @Nullable注解可以使用在属性上面,表示属性值可以为空

@Nullable
private ResourceLoader resourceLoader;

2.3 @Nullable注解可以使用在参数上面,表示参数值可以为空,

public void setParent(@Nullable ApplicationContext parent) {
    
    
    super.setParent(parent);
    this.beanFactory.setParentBeanFactory(this.getInternalParentBeanFactory());
}

注意:使用@Nullable修饰后如果上述各项为空时不会出现空指针异常

3. Spring5支持函数式风格GenermicApplicationContext

以往在代码中直接new对象Spring不能够管理,不好重复使用

函数式风格创建对象,可以交给spring进行统一管理

package com.atguigu.spring5.test;

/**
 * @author huxuyang
 * @create 2022-03-02 21:20
 */
public class User {
    
    
}

package com.atguigu.spring5.test;

import org.junit.Test;
import org.springframework.context.support.GenericApplicationContext;

/**
 * @author huxuyang
 * @create 2022-03-02 21:20
 */

public class testGenericApplicationContext {
    
    
    @Test
    public void testGeneric(){
    
    
        // 1.创建GenericApplicationContext对象
        GenericApplicationContext context = new GenericApplicationContext();
        // 2.刷新注册区域
        context.refresh();
        // 3.调用context方法注册对象
        // 方式一:不指定注册对象的名字,那么想要获得这个对象时需要写这个类的全路径
        context.registerBean(User.class, ()->new User());
        User user = (User)context.getBean("com.atguigu.spring5.test.User");

        // 方式二:指定注册对象的名字,获取对象时通过名字获取即可
        context.registerBean("user1", User.class, ()->new User());
        User user1 = (User)context.getBean("user1");
        System.out.println(user1);
    }
}

4.Spring5整合JUnit测试框架

4.1 整合JUnit4

4.1.1 导入jar包(三个jar包)

在这里插入图片描述
在这里插入图片描述

4.1.2 使用JUnit4进行单元测试

package com.atguigu.spring5.test;

import com.atguigu.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;

/**
 * @author huxuyang
 * @create 2022-03-02 21:40
 */
@RunWith(SpringJUnit4ClassRunner.class)  // 指定单元测试框架版本
@ContextConfiguration("classpath:spring.xml") // 加载配置文件
public class JUnit4Test {
    
    

    @Autowired
    private UserService userService;

    @Test
    public void test1(){
    
    
        userService.accountMoney();
    }
}

4.2 整合JUnit5

4.2.1 导入jar包

在这里插入图片描述

4.2.2 创建测试类,使用注解完成

package com.atguigu.spring5.test;

import com.atguigu.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;

/**
 * @author huxuyang
 * @create 2022-03-02 21:52
 */
@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:spring.xml")
public class JUnit5Test {
    
    

    @Autowired
    private UserService userService;

    @Test
    public void test1(){
    
    
        userService.accountMoney();
    }

}

4.2.3 使用一个复合注解替代上面两个注解完成整合

@SpringJUnitConfig(locations = "classpath:spring.xml")
public class JUnit5Test {
    
    

    @Autowired
    private UserService userService;

    @Test
    public void test1(){
    
    
        userService.accountMoney();
    }

}

5. Spring5新功能–Webflux

5.1 Webflux介绍

  • 前置知识SpringMVC, SpringBoot, Maven, Java8新特性
  • Webflux是Spring5添加的新的模块,用于web开发,功能类似于SpringMVC,Webflux使用的是响应式编程实现的
  • 使用传统web框架,比如SpringMVC,是基于Servlet容器,而Webflux是一种异步非阻塞的框架,异步非阻塞的框架是Servlet3.1以后才支持的,其核心是Reactor的相关API实现的。

什么是异步非阻塞?

  • 异步和同步针对调用者来说:调用者发出请求,如果等待对方回应后再去做其他事情就是同步,如果发送请求之后不再等对方回应就去做其他事情就是异步
  • 阻塞和非阻塞针对被调用者来说:被调用者收到请求后,如果给了回应再去做任务就是非阻塞的,如果做完任务再回应就是阻塞的。

WebFlux特点?

  • 非阻塞式:再有限资源下,提高系统吞吐量和伸缩性,以Reactor为基础实现响应式编程
  • 函数式编程: Spring5框架基于java8,使用java8函数式编程方式实现路由请求

SpringMVC与Webflux比较?

在这里插入图片描述

  • 两个框架都可以使用注解方式, 都运行再Tomcet等容器中
  • SpringMVC采用命令式编程(即一行一行代码实现),Webflux采用异步响应式编程

5.2 响应式编程

5.2.1 什么是响应式编程

  • 响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
  • 电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。

Java8及其之前版本实现响应式编程(应用了观察者模式)

  • Java8提供的观察者模式有两个类Observer和Observable
  • Java9提供的观察者模式类为Flow
import java.util.Observable;

/**
 * @author huxuyang
 * @create 2022-03-03 9:33
 */
public class ObserverDemo extends Observable {
    
    
    public static void main(String[] args) {
    
    
        ObserverDemo observer = new ObserverDemo();

        // 添加观察者
        observer.addObserver((o, arg)->{
    
    
            System.out.println("发生变化");
        });

        observer.addObserver((o, arg)->{
    
    
            System.out.println("发生了变化");
        });

        observer.setChanged(); // 数据变化
        observer.notifyObservers(); //通知
    }
}

响应式编程(Reactor实现)

  • 1.响应式编程操作中,Reactor是满足Reactive规范的框架
  • 2.Reactor有两个核心类,Mono和flux,这两个类实现接口Publisher,提供丰富的操作符。Flux对象实现发布者,可以发送N个元素;Mono实现发布者,发送0或者1个元素。
  • 3.Flux和Mono都是数据流的发布者,使用Flux和Mono都可以发出三种数据信号:元素值,错误信号,完成信号,其中错误信号和完成信号都代表终止信号,终止信号用于告诉订阅者数据流结束了,错误信号终止数据流同时把错误信息传递给订阅者。
代码实现Flux和Mono

5.3 Webflux执行流程和核心API

5.4 Spring Webflux(基于注解编程模型)

5.5 Spring Webflux(基于函数式编程模型)

猜你喜欢

转载自blog.csdn.net/cjhxydream/article/details/123239904