整合 log4j2
输出日志信息
运行时会输出
- 需导入相关jar包
-
创建
log4j2.xml
日志配置文件文件名固定
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>
手动打印日志
在控制台打印指定日志信息
package test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserLog {
private static final Logger log = LoggerFactory.getLogger(UserLog.class);
public static void main(String[] args) {
log.error("hello error");
log.info("hello info");
}
}
@Nullable
可以用在方法上、参数上、属性上
分别表示方法返回值可以为空、参数可以为空、属性可以为空
注册对象利用lambda表达式,把对象注册给Spring
@Test
public void test3() {
GenericApplicationContext context = new GenericApplicationContext();
context.refresh();
context.registerBean("user1", User.class, ()-> new User());
User user1 = context.getBean("user1", User.class);
System.out.println(user1);
}
整合 JUnit
Webflux
Java8 观察者模式
Webflux 底层用的并非此方法
package cc.acdongla.observer;
import java.util.Observable;
public class ObserverTest extends Observable {
public static void main(String[] args) {
ObserverTest observer = new ObserverTest();
observer.addObserver((o, arg) -> {
System.out.println("发生改变了");
});
observer.addObserver((o, arg) -> {
System.out.println("通知发生改变");
});
observer.setChanged(); // 数据变化
observer.notifyObservers(); // 通知
}
}
/*output:
通知发生改变
发生改变了
*/
响应式编程-Reactor实现
三种信号: 元素值、错误信号、完成信号
错误信号和完成信号都是终止信号,错误信号会终止程序并发送错误信息
错误信号和完成信号不能同时存在
Flux: 发送N个元素
Mono: 发送0个或1个元素
maven引入依赖
<dependencies>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.4.10</version>
</dependency>
声明方式
只声明的话数据流不会输出,只有订阅了数据才能输出
public void test1() {
// 声明常量
Flux.just(1, 2, 3, 4);
Mono.just(1);
// 声明数组
Integer[] array = {5, 6, 7, 8};
Flux.fromArray(array);
// 声明集合
List<Integer> list = Arrays.asList(array);
Flux.fromIterable(list);
// 声明stream流
Flux.fromStream(list.stream());
}
订阅并输出
public void test2() {
Flux.just(1, 2, 3, 4).subscribe(System.out::println);
Mono.just(99).subscribe(System.out::println);
}
/*output
1
2
3
4
99
*/
操作符
作用:将数据流做处理,就像工厂流水线
常用操作符:
map : 元素映射为新元素
flagmap : 把每个元素转换成流,把转换之后的多个流合并成大流
执行流程与核心API
SpringWebFlux 基于 Reactor ,默认容器时 Netty, Netty 是高性能的 NIO 框架, 异步非阻塞。
SpringWebFlux 里面 DispatherHandler,负责请求的处理
- HandlerMapping: 请求查询到处理的方法
- HandlerAdapter: 真正负责请求处理
- HandlerResultHandler: 响应结果处理
SpringWebFlux 实现函数式编程两个接口
- RouterFunction: 路由处理
- HandlerFunction: 处理函数
注解编程模型
SpringMVC 实现: 同步阻塞方式,基于SpringMVC+Servlet+Tomcat
SpringWebFlux实现:异步非阻塞方式,基于SpringWebFlux+Reactor+Netty
第一步:maven引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
第二步:配置端口号
在配置文件application.properties
中配置端口号
server.port=8081