整合日志、Nullable注解、函数式风格编程、整合JUnit5、Webflux
Spring5移除了Log4jConfigListener,官方建议使用Log4j2.
依赖:
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-apiartifactId>
<version>2.17.1version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>2.17.1version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-slf4j-implartifactId>
<version>2.17.1version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.30version>
dependency>
log4j2.xml文件:
<configuration status="DEBUG">
<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>
然后写一个主函数运行,就发现日志输出变了,就会按照上面输出日志格式的设定。< configuration > 标签内的属性status="DEBUG",属性值可以改成OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL(任意一个,这里是优先级顺序)。
@Nullable注解可以使用在方法上面,属性上面,参数上面,表示方法可以返回为空,属性值可以为空,参数值可以为空。
(1)注解使用在方法上面,方法返回值可以为空。
@Nullable
String getId();
(2)注解使用在方法参数里,方法参数可以为空。
public <T> void select(@Nullable String name,int id){
....
....
return <T>;
}
(3)注解使用在属性上面,属性值可以为空
@Nullabele
private String bookName;
函数式创建对象,交给Spring管理
代码:
package com.dragon.xintexing;
import com.dragon.spring5.User;
import org.springframework.context.support.GenericApplicationContext;
public class test1 {
public static void main(String[] args) {
//创建GenericApplicationContext对象
GenericApplicationContext context=new GenericApplicationContext();
//调用context的方法对象注册
context.refresh();
context.registerBean(User.class,()->new User());
//获取在Spring注册的对象
User user=(User) context.getBean("com.dragon.spring5.User");
System.out.println(user);
}
}
JUnit5的代码:
package com.dragon.xintexing;
import com.dragon.shiwu.service.UserService;
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;
import org.junit.jupiter.api.Test;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@ExtendWith(SpringExtension.class) //单元测试框架
@ContextConfiguration("classpath:bean8.xml")//加载配置文件
//@SpringJUnitConfig(locations = "classpath:bean8.xml")
public class J5test {
@Autowired
private UserService userService;
@Test
public void test1(){
userService.accountMoney();
}
}
上面的
注释掉的@SpringJUnitConfig注解可以替代它上面的两个注解使用,是复合注解。
JUnit4的代码:
package com.dragon.xintexing;
import com.dragon.shiwu.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:bean8.xml")//加载配置文件
public class Jtest {
@Autowired
private UserService userService;
@Test
public void test1(){
userService.accountMoney();
}
}
大家可以自行对比一下
这里再补充一下bean8.xml代码:
大家不需要太注意我的配置文件,主要给你们模拟测试参考用的。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${pro.driverClass}">property>
<property name="url" value="${pro.url}">property>
<property name="username" value="${pro.username}">property>
<property name="password" value="${pro.password}">property>
bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource">property>
bean>
<context:component-scan base-package="com.dragon.shiwu">context:component-scan>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">property>
bean>
<tx:annotation-driven transaction-manager="transactionManager">tx:annotation-driven>
beans>
以上就是Spring5新功能的讲解,Webflu还未讲解,后面我会出一篇文章专门讲诉。