概述
- 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"?>
<configuration status="INFO">
<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>
<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;
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;
public class User {
}
package com.atguigu.spring5.test;
import org.junit.Test;
import org.springframework.context.support.GenericApplicationContext;
public class testGenericApplicationContext {
@Test
public void testGeneric(){
GenericApplicationContext context = new GenericApplicationContext();
context.refresh();
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;
@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;
@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;
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(基于函数式编程模型)
|