六、Spring 5.0的新特性

1 与jdk相关的升级

1.1 jdk版本要求

  1. Spring 5.0在2017年9月发布了它的GA(通用)版本。该版本是基于jdk 8编写的,所以jdk 8以下版本将无法使用。同时,可以兼容jdk 9版本。
  2. Tomcat版本要求8.5及以上。

注意:我们使用jdk 8构建工程,可以降版编译。但是不能使用jdk 8以下版本构建工程。由于jdk和tomcat版本的更新,我们的IDE也需要同时更新。(目前使用的eclipse 4.7.2)

1.2 利用jdk 8版本更新的内容

  1. 基于jdk 8的反射增强:
    测试代码:

    public class Test {
    	//循环次数定义:10亿次 
    	private static final int loopCnt = 1000 * 1000 * 1000;
    	
    	public static void main(String[] args) throws Exception {
    		//输出jdk的版本 
    		System.out.println("java.version=" + System.getProperty("java.version"));
    		t1();
    		t2();
    		t3();
    	}
    	
    	// 每次重新生成对象 
    	public static void t1() {
    		long s = System.currentTimeMillis();
    		for (int i = 0; i < loopCnt; i++) {
    			Person p = new Person();
    			p.setAge(31);
    		}
    		long e = System.currentTimeMillis();
    		System.out.println("循环10亿次创建对象的时间:" + (e - s));
    	}
    	
    	// 同一个对象 
    	public static void t2() {
    		long s = System.currentTimeMillis();
    		Person p = new Person();
    		for (int i = 0; i < loopCnt; i++) {
    			p.setAge(32);
    		}
    		long e = System.currentTimeMillis();
    		System.out.println("循环10亿次给同一对象赋值的时间:" + (e - s));
    	}
    	
    	//使用反射创建对象 
    	public static void t3() throws Exception {
    		long s = System.currentTimeMillis();
    		Class<Person> c = Person.class;
    		Person p = c.newInstance();
    		Method m = c.getMethod("setAge", Integer.class);
    		for (int i = 0; i < loopCnt; i++) {
    			m.invoke(p, 33);
    		}
    		long e = System.currentTimeMillis();
    		System.out.println("循环10亿次反射创建对象的时间:" + (e - s));
    	}
    	
    	static class Person {
    		private int age = 20;
    		public int getAge() {
    			return age;
    		}
    		public void setAge(Integer age) {
    			this.age = age;
    		}
    	}
    }
    

    jdk 1.8版本(jdk 8)运行时间如下:
    在这里插入图片描述
    当切换到jdk 1.7版本之后,运行时间如下:
    在这里插入图片描述
    有此我们可以看出,在反射创建对象上,jdk 8确实做了加强。

  2. @NonNull注解:@Nullable@NotNull 注解来显示表明可为空的参数和以及返回值。这样就够在编译的时候处理空值而不是在运行时抛出 NullPointerExceptions

  3. 日志记录:Spring Framework 5.0带来了 Commons Logging 桥接模块的封装, 它被叫做 spring-jcl 而不是标准的 Commons Logging 。当然,无需任何额外的桥接,新版本也会对 Log4j 2.xSLF4JJUL(java.util.logging) 进行自动检测。

2 核心容器的更新

Spring Framework 5.0现在支持候选组件索引作为类路径扫描的替代方案。该功能已经在类路径扫描器中添加,以简化添加候选组件标识的步骤。
应用程序构建任务可以定义当前项目自己的 META-INF/spring.components 文件。在编译时,源模型是自包含的,JPA实体和Spring组件是已被标记的。
从索引读取实体而不是扫描类路径对于小于200个类的小型项目是没有明显差异。但对大型项目影响较大。加载组件索引开销更低。因此,随着类数的增加,索引读取的启动时间将保持不变。
加载组件索引的耗费是廉价的。因此当类的数量不断增长,加上构建索引的启动时间仍然可以维持一个常数,不过对于组件扫描而言,启动时间则会有明显的增长。
这个对于我们处于大型Spring项目的开发者所意味着的,是应用程序的启动时间将被大大缩减。虽然20或者30秒钟看似没什么,但如果每天要这样登上好几百次,加起来就够你受的了。使用了组件索引的话,就能帮助你每天过的更加高效。
你可以在Spring的Jira上了解更多关于组件索引的相关信息。

3 JetBrains Kotlin语言支持

  1. Kolin概述:是一种支持函数式编程风格的面向对象语言。Kotlin 运行在 JVM之上,但运行环境并不限于JVM。

  2. Kolin示例代码:

    {
    	("/movie" and accept(TEXT_HTML)).nest {
    		GET("/", movieHandler::findAllView)
    		GET("/{card}", movieHandler::findOneView)
    	}
    	("/api/movie" and accept(APPLICATION_JSON)).nest {
    		GET("/", movieApiHandler::findAll)
    		GET("/{id}", movieApiHandler::findOne)
    	}
    }
    
  3. Kolin注册bean对象到Spring容器:

    val context = GenericApplicationContext {
    	registerBean()
    	registerBean {
    		Cinema(it.getBean())
    	}
    }
    

4 响应式编程风格

此次Spring发行版本的一个激动人心的特性就是新的响应式堆栈WEB框架。这个堆栈完全的响应式且非阻塞,适合于事件循环风格的处理,可以进行少量线程的扩展。
Reactive Streams是来自于Netflix,Pivotal,Typesafe,RedHat,Oracle,Twitter以及Spray.io的工程师特地开发的一个API。它为响应式编程实现的实现提供一个公共的API,好实现Hibernate的JPA。这里JPA就是这个API,而Hibernate就是实现。
Reactive Streams API是Java 9的官方版本的一部分。在Java 8中,你会需要专门引入依赖来使用Reactive Streams API。
Spring Framework 5.0对于流式处理的支持依赖于Project Reactor来构建,其专门实现了Reactive Streams API。
Spring Framework 5.0拥有一个新的spring-webflux模块,支持响应式HTTP和WebSocket客户端。SpringFramework5.0还提供了对于运行于服务器之上,包含了REST,HTML,以及WebSocket风格交互的响应式网页应用程序的支持。
在spring-webflux中包含了两种独立的服务端编程模型:

  1. 基于注解:使用到了@Controller以及SpringMVC的其它一些注解;
  2. 使用Java8lambda表达式的函数式风格的路由和处理。

有了Spring Webflux,你现在可以创建出WebClient,它是响应式且非阻塞的,可以作为Rest Template的一个替代方案。
这里有一个使用Spring 5.0的REST端点的WebClient实现:

WebClient webClient = WebClient.create();
Mono person = webClient.get()
					.uri("http://localhost:8080/movie/42")
					.accept(MediaType.APPLICATION_JSON)
					.exchange()
					.then(response -> response.bodyToMono(Movie.class));

5 Junit 5支持

完全支持JUnit 5 Jupiter,所以可以使用JUnit 5来编写测试以及扩展。此外还提供了一个编程以及扩展模型,Jupiter子项目提供了一个测试引擎来在Spring上运行基于Jupiter的测试。
另外,Spring Framework 5.0还提供了在Spring TestContext Framework中进行并行测试的扩展。
针对响应式编程模型,spring-test现在还引入了支持Spring WebFlux的WebTestClient集成测试的支持,类似于MockMvc,并不需要一个运行着的服务端。使用一个模拟的请求或者响应,WebTestClient就可以直接绑定到WebFlux服务端设施。
你可以在这里找到这个激动人心的TestContext框架所带来的增强功能的完整列表。
当然,Spring Framework 5.0仍然支持我们的老朋友JUnit!在我写这篇文章的时候,JUnit 5还只是发展到了GA版本。对于JUnit 4,Spring Framework在未来还是要支持一段时间的。

6 依赖类库的更新

  1. 终止支持的类库:Portlet、Velocity、JasperReports、XMLBeans、JDO、Guava;
  2. 支持的类库:Jackson 2.6+、EhCache 2.10+ / 3.0 GA、Hibernate 5.0+、JDBC 4.0+、XmlUnit 2.x+、OkHttp 3.x+、Netty 4.1+。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值