日志

整合 log4j2

输出日志信息

运行时会输出

  1. 需导入相关jar包
Spring5 新功能_端口号
  1. 创建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