Java_Spring之Spring5?的新特性
1 與 JDK 相關(guān)的升級
1.1 jdk 版本要求:
- spring5.0 在 2017 年 9 月發(fā)布了它的 GA(通用)版本。該版本是基于 jdk8 編寫的,所以 jdk8 以下版本將無法使用。同時,可以兼容 jdk9 版本。
- tomcat 版本要求 8.5 及以上。
- 注:
- 使用 jdk8 構(gòu)建工程,可以降版編譯。但是不能使用 jdk8 以下版本構(gòu)建工程。
- 由于 jdk 和 tomcat 版本的更新,IDE 也需要同時更新。(目前使用的 eclipse 4.7.2)
1.2 利用 jdk8 版本更新的內(nèi)容
第一:基于 JDK8 的反射增強
請看下面的代碼:
public class Test { //循環(huán)次數(shù)定義: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("循環(huán) 10 億次創(chuàng)建對象的時間:" + (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("循環(huán) 10 億次給同一對象賦值的時間: " + (e - s)); } //使用反射創(chuàng)建對象 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("循環(huán) 10 億次反射創(chuàng)建對象的時間:" + (e - s)); } static class Person { private int age = 20; public int getAge() { return age; } public void setAge(Integer age) { this.age = age; } } }
jdk1.8 版本(就是 JDK8)運行時間如下:
當(dāng)切換到 jdk1.7 版本之后,運行時間如下:
有此我們可以看出,在反射創(chuàng)建對象上,jdk8 確實做了加強。
- 第二:@NonNull 注解和@Nullable 注解的使用
- 用 @Nullable 和 @NotNull 注解來顯示表明可為空的參數(shù)和以及返回值。這樣就夠在編譯的時候處理空值而不是在運行時拋出 NullPointerExceptions。
- 第三:日志記錄方面
- Spring Framework 5.0 帶來了 Commons Logging 橋接模塊的封裝, 它被叫做 spring-jcl 而不是標(biāo)準(zhǔn)的 Commons Logging。當(dāng)然,無需任何額外的橋接,新版本也會對 Log4j 2.x, SLF4J, JUL ( java.util.logging) 進(jìn)行自動檢測。
2 核心容器的更新
- Spring Framework 5.0 現(xiàn)在支持候選組件索引作為類路徑掃描的替代方案。該功能已經(jīng)在類路徑掃描器中添加,以簡化添加候選組件標(biāo)識的步驟。
- 應(yīng)用程序構(gòu)建任務(wù)可以定義當(dāng)前項目自己的 META-INF/spring.components 文件。在編譯時,源模型是自包含的,JPA 實體和 Spring 組件是已被標(biāo)記的。
- 從索引讀取實體而不是掃描類路徑對于小于 200 個類的小型項目是沒有明顯差異。但對大型項目影響較大。加載組件索引開銷更低。因此,隨著類數(shù)的增加,索引讀取的啟動時間將保持不變。
- 加載組件索引的耗費是廉價的。因此當(dāng)類的數(shù)量不斷增長,加上構(gòu)建索引的啟動時間仍然可以維持一個常數(shù), 不過對于組件掃描而言,啟動時間則會有明顯的增長。
- 這個對于處于大型 Spring 項目的開發(fā)者所意味著的,是應(yīng)用程序的啟動時間將被大大縮減。雖然 20或者 30 秒鐘看似沒什么,但如果每天要這樣登上好幾百次,加起來就夠你受的了。使用了組件索引的話,就能幫助你每天過的更加高效。
可以在 Spring 的 Jira 上了解更多關(guān)于組件索引的相關(guān)信息。
3 JetBrains Kotlin 語言支持
Kolin概述:是一種支持函數(shù)式編程編程風(fēng)格的面向?qū)ο笳Z言。Kotlin 運行在 JVM 之上,但運行環(huán)境并不限于 JVM。
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) } }
Kolin 注冊 bean 對象到 spring 容器:
val context = GenericApplicationContext { registerBean() registerBean { Cinema(it.getBean()) } }
4 響應(yīng)式編程風(fēng)格
- 此次 Spring 發(fā)行版本的一個激動人心的特性就是新的響應(yīng)式堆棧 WEB 框架。這個堆棧完全的響應(yīng)式且非阻塞,適合于事件循環(huán)風(fēng)格的處理,可以進(jìn)行少量線程的擴展。
- Reactive Streams 是來自于 Netflix, Pivotal, Typesafe, Red Hat, Oracle, Twitter 以及Spray.io 的工程師特地開發(fā)的一個 API。它為響應(yīng)式編程實現(xiàn)的實現(xiàn)提供一個公共的 API,好實現(xiàn)Hibernate 的 JPA。這里 JPA 就是這個 API, 而 Hibernate 就是實現(xiàn)。
- Reactive Streams API 是 Java 9 的官方版本的一部分。在 Java 8 中, 你會需要專門引入依賴來使用 Reactive Streams API。
- Spring Framework 5.0 對于流式處理的支持依賴于 Project Reactor 來構(gòu)建, 其專門實現(xiàn)了Reactive Streams API。
- Spring Framework 5.0 擁有一個新的 spring-webflux 模塊,支持響應(yīng)式 HTTP 和 WebSocket 客戶端。
- Spring Framework 5.0 還提供了對于運行于服務(wù)器之上,包含了 REST, HTML, 以及 WebSocket 風(fēng)格交互的響應(yīng)式網(wǎng)頁應(yīng)用程序的支持。
- 在 spring-webflux 中包含了兩種獨立的服務(wù)端編程模型:
- 基于注解:使用到了@Controller 以及 Spring MVC 的其它一些注解;
- 使用 Java 8 lambda 表達(dá)式的函數(shù)式風(fēng)格的路由和處理。
- 有 了 Spring Webflux, 你現(xiàn)在可以創(chuàng)建出 WebClient, 它是響應(yīng)式且非阻塞的,可以作為RestTemplate 的一個替代方案。
- 這里有一個使用 Spring 5.0 的 REST 端點的 WebClient 實現(xiàn):
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 Junit5 支持
- 完全支持 JUnit 5 Jupiter,所以可以使用 JUnit 5 來編寫測試以及擴展。此外還提供了一個編程以及擴展模型,Jupiter 子項目提供了一個測試引擎來在 Spring 上運行基于 Jupiter 的測試。
- 另外,Spring Framework 5 還提供了在 Spring TestContext Framework 中進(jìn)行并行測試的擴展。
- 針對響應(yīng)式編程模型, spring-test 現(xiàn)在還引入了支持 Spring WebFlux 的 WebTestClient 集成測試的支持,類似于 MockMvc,并不需要一個運行著的服務(wù)端。使用一個模擬的請求或者響應(yīng), WebTestClient 就可以直接綁定到 WebFlux 服務(wù)端設(shè)施。
- 可以在這里找到這個激動人心的 TestContext 框架所帶來的增強功能的完整列表。
- Spring Framework 5.0 仍然支持 JUnit!
6 依賴類庫的更新
終止支持的類庫
- Portlet.
- Velocity.
- JasperReports.
- XMLBeans.
- JDO.
- Guava.
- 支持的類庫
- Jackson 2.6+
- EhCache 2.10+ / 3.0 GA
- Hibernate 5.0+
- JDBC 4.0+
- XmlUnit 2.x+
- OkHttp 3.x+
- Netty 4.1+
到此這篇關(guān)于Java_Spring之Spring5 的新特性的文章就介紹到這了,更多相關(guān)Java Spring5新特性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java基礎(chǔ)之spring5新功能學(xué)習(xí)
- Java Spring5學(xué)習(xí)之JdbcTemplate詳解
- Java基礎(chǔ)之Spring5的核心之一IOC容器
- Java?spring?通過注解方式創(chuàng)建對象的示例詳解
- SpringBoot使用過濾器、攔截器和監(jiān)聽器的案例代碼(Springboot搭建java項目)
- java:無法訪問org.springframework.boot.SpringApplication的解決方法
- JAVA中SpringBoot啟動流程分析
- Java?SpringBoot?@Async實現(xiàn)異步任務(wù)的流程分析
相關(guān)文章
JDK8中String的intern()方法實例詳細(xì)解讀
String字符串在我們?nèi)粘i_發(fā)中最常用的,當(dāng)然還有他的兩個兄弟StringBuilder和StringBuilder,接下來通過本文給大家介紹JDK8中String的intern()方法詳細(xì)解讀,需要的朋友可以參考下2022-09-09java學(xué)生信息管理系統(tǒng)MVC架構(gòu)詳解
這篇文章主要為大家詳細(xì)介紹了java學(xué)生信息管理系統(tǒng)MVC架構(gòu)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11基于JAVA中Jersey處理Http協(xié)議中的Multipart的詳解
之前在基于C#開發(fā)彩信用最原始的StringBuilder拼接字符串方式處理過Multipart。現(xiàn)在在做一個項目的時候,由于之前的技術(shù)路線都是使用Jersey處理Http這塊,為了保持技術(shù)路線一致,研究了一下如何使用Jersey處理Http協(xié)議中的Multipart2013-05-05JAVA 數(shù)據(jù)結(jié)構(gòu)鏈表操作循環(huán)鏈表
這篇文章主要介紹了JAVA 數(shù)據(jù)結(jié)構(gòu)鏈表操作循環(huán)鏈表的相關(guān)資料,需要的朋友可以參考下2016-10-10