Spring5 新特性(六)

Spring5框架代码基于java8,兼容java9,删除了很多不建议使用的类和方法。

一、日志

Spring5自带了通用的日志封装。

  • Spring5已经移除了Log4jConfigLister。默认推荐使用log4j2.

    第一步 导入依赖

        <dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-api</artifactId>

<version>2.12.1</version>

</dependency>

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.12.1</version>

</dependency>

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-slf4j-impl</artifactId>

<version>2.12.1</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

<version>1.7.30</version>

</dependency>

第二步 配置文件 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 patten="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>

</console>

</appenders>

<!--然后定义logger,只有定义了logger,appender才会生效-->

<!--root用于指定项目的根日志,如果没有单独指定logger,则会使用root作为默认的日志输出-->

<logger>

<root level="info">

<appender-ref ref="Console"/>

</root>

</logger>

</configuration>

二、@Nullable 注解

可以用在方法上,属性上,参数上。

  • 方法上表示返回值可以为空
  • 属性上表示属性可以为空
  • 参数上表示参数可以为空

三、支持函数式编程

public void spring5(){

//创建对象

GenericApplicationContext context = new GenericApplicationContext();

//调用context进行注册

context.refresh();//先刷新一下

context.registerBean("user1",User.class,()->new User());

//获取Spring里面的对象

// User user = context.getBean("com.bin.spring5.jdbc.domain.User", User.class);//如果指定beanName,需要使用全路径

User user = context.getBean("user1", User.class);//使用bean名称

}

四、单元测试

整合junit4

引入Spring test包

        <dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-test</artifactId>

<version>${spring.version}</version>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

<scope>test</scope>

</dependency>

代码

import com.bin.spring5.jdbc.dao.UserDao;

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;

@RunWith(SpringJUnit4ClassRunner.class)//指定单元测试框架的版本

@ContextConfiguration("classpath:jdbc.xml")

public class Junit4 {

@Autowired

private UserDao dao;

@Test

public void test(){

dao.delete("1");

}

整合 junit5

导入依赖

        <dependency>

<groupId>org.junit.jupiter</groupId>

<artifactId>junit-jupiter-api</artifactId>

<version>5.6.2</version>

<scope>test</scope>

</dependency>

代码

import com.bin.spring5.jdbc.dao.UserDao;

import org.junit.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

//@RunWith(SpringJUnit4ClassRunner.class)//指定单元测试框架的版本

//@ContextConfiguration("classpath:jdbc.xml")

@SpringJUnitConfig(locations = "classpath:jdbc.xml")//符合注解 替代上面两个注解

public class Junit4 {

@Autowired

private UserDao dao;

@Test

public void test(){

dao.delete("1");

}

}

五、SpringWebFlux

Spring5添加的新模块,用于web开发,功能与SpringMVC类似,WebFulx使用当前一种比较流行的响应式编程。

传统的web框架,比如SpringMVC基于Servlet容器,WebFlux是一种异步非阻塞的框架,异步非阻塞框架在Servlet3.1以后才支持,核心是基于Reactor的相关API实现的。

同步和异步:针对调用者,如果调用者发送请求,等待对方回应就是同步,不等待去做其他事就是异步(AJAX)

阻塞和非阻塞:针对被调用者,被调用作者收到请求,做完了请求任务之后才给出反馈就是阻塞,收到请求之后,马上给出反馈,然后去做事情,就是非阻塞。

特点:

  • 非阻塞式:在有限的资源下,提高系统的吞吐量和伸缩性
  • 函数式编程:在WebFlux使用java8函数式编程方式实现功能

SpringMvc和WebFlux的区别 上图

5.1响应式编程

响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。

Java8及期之前的版本

  • 提供了观察者模式的两个类Observer和Observable

public class ObserverDemo extends Observable {

public static void main(String[] args) {

ObserverDemo observerDemo = new ObserverDemo();

//添加观察者

observerDemo.addObserver((o,arg)->{

System.out.println("发生变化");

});

observerDemo.addObserver((o,arg)->{

System.out.println("发生变化222");

});

observerDemo.setChanged();//数据变化

observerDemo.notifyObservers();//通知

}

}

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

		<dependency>

<groupId>io.projectreactor</groupId>

<artifactId>reactor-core</artifactId>

<version>3.1.5.RELEASE</version>

</dependency>

import reactor.core.publisher.Flux;

import reactor.core.publisher.Mono;

import java.util.Arrays;

import java.util.List;

import java.util.stream.Stream;

public class TestReactor {

public static void main(String[] args) {

//just方法声明

Flux.just(1,2,3,4);

Mono.just(1);

//其他方法

Integer[] arr = {1,2,3,4};

Flux.fromArray(arr);

List<Integer> list = Arrays.asList(arr);

Flux.fromIterable(list);

Stream<Integer> stream = list.stream();

Flux.fromStream(stream);

}

}

三种信号的特点

  • 错误信号和完成信号都是终止信号,不能共存
  • 如果没用任何元素值,而是直接发送错误和完成信号,表示是空数据流。
  • 如果没有错误信号,没有完成信号,表示是无线数据流

调用just或者其他的方法只是声明数据流,数据流并没有发出,只有订阅之后才会触发数据流,不订阅什么都不会发生。

Flux.just(1,2,3,4).subscribe(System.out::println);

操作符:对数据流进行一道道操作,成为操作符,比如工厂流水线

  • map 元素映射为新元素

  • flatmap 元素映射为流

5.2WebFulx的执行流程和核心API

5.3基于注解编程模型

5.4基于函数式编程模型

以上是 Spring5 新特性(六) 的全部内容, 来源链接: utcz.com/a/36353.html

回到顶部