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