0%

Java 企业开发基础 Spring5-新功能

Spring5 框架新功能

整个 Spring5 框架的代码基于 Java8,运行时兼容 JDK9,许多不建议使用的类和方法在代码库中删除了。

Spring 5 框架自带了通用的日志封装

  • Spring5 已经移除 Log4jConfigListener,官方建议使用 Log4j2
  • Spring5 框架整合 Log4j2

整合 log4j2 步骤

  1. 引入 jar 包 : log4j-api-2.11.2.jarlog4j-core-2.11.2.jarlog4j-slf4j-impl-2.11.2.jarslf4j-api-1.7.30.jar

  2. 创建 log4j2.xml (名字固定,不可变)配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?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>

运行时会输出对应的日志信息

image-20220928203316265

示例代码:手动输出日志信息

1
2
3
4
5
6
7
8
public class UserLog {
private static final Logger log = LoggerFactory.getLogger(UserLog.class);

public static void main(String[] args) {
log.info("hello log4j2");
log.warn("hello log4j2");
}
}

运行结果

image-20220928203743366

Spring5 框架核心容器支持@Nullable 注解

@Nullable 注解可以使用在方法、属性、参数上面,表示方法返回可以为空,属性值可以为空,参数值可以为空

Spring5 核心容器支持函数式风格

GenericApplicationContext 支持 lambda 表达式相关操作

1
2
3
4
5
6
7
8
9
10
11
12
13
// 函数式风格创建对象
@Test
public void testGenericApplicationContext() {
// 1.创建 GenericApplicationContext 对象
GenericApplicationContext context = new GenericGroovyApplicationContext();
// 2.调用context的方法进行对象注册
context.refresh();
context.registerBean("account", Account.class, () -> new Account()); // "account"对象名可以省略,
// 3.获取 spring 注册的对象
Account account = (Account) context.getBean("account");
// Account account = (Account) context.getBean("com.xzt.springaffair.entity.Account"); // 如果上面没有指定对象名,需要这样创建
System.out.println(account);
}

Spring5 支持整合 JUnit5

整合 JUnit4

image-20220928213934627

  1. 引入 spring 相关测试的依赖 spring-test-5.3.23.jar
  2. 创建测试类,引用注解方法方式完成
1
2
3
4
5
6
7
8
9
10
11
12
@RunWith(SpringJUnit4ClassRunner.class)  // 单元测试框架
@ContextConfiguration("classpath:bean1.xml") // 加载配置文件
public class JTest4 {

@Autowired
private AccountService accountService;

@Test
public void test1() {
accountService.accountMoney();
}
}

整合 JUnit5

  1. 需要引入 JUnit5 jar包

    image-20220928214113055

  2. 创建测试类,使用注解实现。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 写法1
    //@ExtendWith(SpringExtension.class)
    //@ContextConfiguration("classpath:bean1.xml")

    // 写法2 符合注解
    @SpringJUnitConfig(locations = "classpath:bean1.xml")
    public class JTest5 {
    @Autowired
    private AccountService accountService;

    @Test
    public void test1() {
    accountService.accountMoney();
    }
    }

Spring5 框架新功能 - SpringWebflux

Webflux是 Spring5 添加新的模块,用于 web 开发的,功能和 SpringMVC 类似的,Webflux 使用 当前一种比较流行的响应式编程出现的框架。

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

解释什么是异步非阻塞 :⭐

(1)异步和同步 (针对调用者)

  • 同步: 调用者发送请求,如果等着对方回应之后才去做其他事情就是同步
  • 异步: 调用者发送请求,如果发送请求之后不等着对方回应就去做其他事情就是异步 √

(2)非阻塞和阻塞 (针对被调用者)

  • 阻塞: 被调用者受到请求之后,做完请求任务之后才给出反馈就是阻塞
  • 非阻塞: 被调用者受到请求之后,受到请求之后马上给出反馈然后再去做事情就是非阻塞 √

Webflux 特点

  • 非阻塞式:在有限资源下,提高系统吞吐量和伸缩性,以 Reactor 为基础实现响应式编程。
  • 函数式编程:Spring5 框架基于 java8,Webflux 使用 Java8 函数式编程方式实现路由请求。

SpringMVC 和 Webflux之间区别

  • 相同:两个框架都可以使用注解方式,都运行在 Tomcat 等容器中。
  • 不同:SpringMVC 采用命令式编程,Webflux 采用异步响应式编程。

响应式编程 - Java实现

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

例子:电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似”=B1+C1”的公 式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。

Java8 及其之前版本是提供的观察者模式两个类 ObserverObservable实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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(); //进行通知
}
}

继续看视频,不理解的地方

正在加载今日诗词....