1. 程式人生 > >在Spring Framework 5.0中引入Kotlin支援

在Spring Framework 5.0中引入Kotlin支援



我們幾個月前有介紹關於 Kotlin在start.spring.io上的支援 ,我們有一直在進行工作,以確保Spring和 Kotlin 在一起玩得很好。 Kotlin的一個關鍵優勢是它提供了一個與用Java編寫的庫之間非常好的互操作性。但是有更多的方法可以進一步,允許編寫完全成熟的Kotlin程式碼,當開發您的下一個Spring應用程式。除了Spring Framework對Java 8的支援,Kotlin應用程式可以利用類似功能的Web或bean註冊API,還有其他Kotlin專用功能,應該可以讓你的生產力水平達到一個新的高度。

這就是為什麼我們在 Spring Framework 5.0 M4 中引入了一個專門的Kotlin支援,我想在這篇部落格中總結的功能,旨在使您的開發人員體驗無縫的在Spring中一起使用這些技術。你可以使用

這個連結在Spring Framework bug tracker中查詢Kotlin的相關問題。

利用Kotlin可空資訊(nullable information)

Spring最初基於來自 Raman Gupta 的社群貢獻,現在利用 Kotlin null-safety support 以確定是否需要HTTP引數,而不必顯式地定義 required 屬性。 這意味著 @RequestParam name:String? 被視為不需要(not required), @RequestParam name:String 視為必需。 這也支援Spring訊息 @Header 註解。

以類似的方式,使用 @Autowired 或 @Inject 的Spring bean注入使用此資訊來知道是否需要bean。 @Autowired lateinit var foo:Foo 意味著 Foo 型別的bean必須在應用程式上下文中註冊,而 @Autowired lateinit var foo:Foo? 不會引發錯誤,如果這樣的bean不存在。

RestTemplate和Functional Web API的擴充套件

Kotlin extensions 允許以非侵入方式擴充套件現有的API,提供了一個更好的替代實用程式類或在Kotlin特定類層次結構中新增Kotlin專用功能到Spring中。一些類似 Mario Arias 的 KotlinPrimavera 已經展示了我們可以帶給Spring的各種Kotlin助手API,以允許編寫更多的慣用程式碼。使用Spring Framework 5,我們集成了Spring框架中最有用和最受歡迎的擴充套件,並添加了新的擴充套件。

例如, Kotlin reified type parameters 為JVM泛型型別擦除提供了一個解決方法,因此我們介紹了一些擴充套件,以利用此功能在可能的情況下提供更好的API。

這允許為RestTemplate提供方便的API(感謝來自Netflix的 Jon Schneider 為此做出貢獻)。例如,要在Java中檢索“Foo”物件的列表,必須寫:

List<Foo> result = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Foo>>() { }).getBody();

或者,如果你使用中間陣列:

List<Foo> result = Arrays.asList(restTemplate.getForObject(url, Foo[].class));

而在Kotlin與Spring Framework 5擴充套件中,你將能夠寫:

val result : List<Foo> = restTemplate.getForObject(url)

請注意,Kotlin副檔名是靜態解析的,你必須匯入它們。 在上面的示例中,您需要新增 import org.springframework.web.client.RestOperationsExtension.getForObject 才能使用它。 Kotlin擴充套件通常由IDE(如IntelliJ IDEA)(如靜態匯入)自動建議,但對於巢狀在容器 object 中的擴充套件,它仍然無效(您可以投票KT-15440),所以直到它被修復,你將不得不手動新增Spring Kotlin擴充套件匯入。

Spring Framework 5.0 M4中目前可用的“RestTemplate”或功能性Web API擴充套件包括:

這些擴充套件還提供了支援本地Kotlin KClass 的成員函式,允許你指定 Foo :: class 引數而不是 Foo :: class.java 。

Reactor Kotlin extensions

Reactor 是Spring Framework 5.0的反應基礎,並且有很好的機會你將使用它的 Mono , Flux 和[StepVerifier] 開發reactive Web應用程式時的API。

所以今天我們還通過新的 reactor-kotlin 專案在Reactor中引入Kotlin支援!它提供了擴充套件,能夠通過寫入 foo.toMono() 從任何類例項建立 Mono 例項,許多人喜歡 Mono.just(foo) 。它還支援例如使用 stream.toFlux() 從Java 8 Stream 例項建立 Flux 。還提供了 Iterable , CompletableFuture 和 Throwable 擴充套件以及基於KClass的Reactor API變體。

這仍然是這個專案的早期,所以如果你想提供沒有的功能,隨時自由地 貢獻 你自己的擴充套件。

Functional bean registration with Kotlin

Spring Framework 5.0引入了一種新的方式來註冊bean,使用lambda作為XML或JavaConfig的替代,使用 @Configuration 和 @Bean 。 簡而言之,它使得有可能註冊bean與一個 Supplier lambda,充當一個 FactoryBean 。

在Java中,你將會寫如下的程式碼:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.registerBean(Foo.class);
context.registerBean(Bar.class, () -> new 
	Bar(context.getBean(Foo.class))
);

而在Kotlin中,reified型別引數允許我們簡單地寫:

val context = AnnotationConfigApplicationContext()
context.registerBean(Foo::class)
context.registerBean(Supplier {
	Bar(context.getBean(Foo::class))
})

你可以看到Spring應用程式的一個具體例子,在 https://github.com/mix-it/mixit / 使用函式 web 和 bean註冊 API。

ApplicationContext 相關Kotlin可用擴充套件如下:

No need to declare your bean class as open anymore

直到現在,使用Kotlin構建Spring Boot應用程式時遇到的幾個問題之一是需要在每個類上新增一個 open 關鍵字,並且使用CGLIB(如 @Configuration 類)來代替Spring bean的成員函式。 這個需求的根本原因來自於事實,在Kotlin, classes are final by default 。

幸運的是,Kotlin 1.0.6現在提供了一個 kotlin-spring 外掛,在預設情況下開啟類和它們的成員函式,註解或元註解使用以下註解之一:

  • @Component
  • @Async
  • @Transactional
  • @Cacheable

元註解支援意味著用 @Configuration , @Controller , @RestController , @Service 或 @Repository 註解的類會自動開啟,因為這些註解是使用 @Component 進行的元註解。

我們更新了 start.spring.io 預設啟用它。 你可以看看 這個Kotlin 1.0.6部落格帖子 瞭解更多詳情,包括 新的 kotlin-jpa 和 kotlin-noarg 外掛對Spring Data實體非常有用。

Kotlin based Gradle build configuration

回到5月,Gradle 宣佈 ,他們將支援在Groovy之外的Kotlin中編寫構建和配置檔案。這使得可以在IDE中具有完全自動完成和驗證,因為這些檔案是常規靜態型別的Kotlin指令碼檔案。這很可能成為基於Kotlin的專案的自然選擇,但這也對Java專案也很有價值。

自5月以來, gradle-script-kotlin 專案不斷髮展,現在可以使用2個警告:

  • 你需要Kotlin 1.1-EAP IDEA外掛來獲得自動完成(但如果你使用 kotlin-spring 外掛,因為 1.1-M04 不能可靠地使用這個外掛,等待Kotlin 1.1-M05 )
  • 文件不完整,但Gradle團隊對Kotlin Slack的#gradle頻道非常有幫助。

兩個 spring-boot-kotlin-demo 專案使用這種基於Kotlin的Gradle構建,可以隨意看看。我們)在start.spring.io 討論 上添加了這樣的支援。

Kotlin Script based templates

從4.3版本開始,Spring Framework提供了一個 ScriptTemplateView 使用支援 JSR-223 的指令碼引擎來渲染模板。 K

這使得出現了一些有趣的使用情況,如使用 kotlinx.html DSL或簡單的Kotlin multiline(多線)’String’插值,編寫型別安全模板,例如此 kotlin -script-templating 專案。 這可以允許您在IDE中編寫具有完全自動完成功能和重構支援的這類模板:

import io.spring.demo.User
import io.spring.demo.joinToLine

"""
${include("header", bindings)}
<h1>Title : $title</h1>
<ul>
    ${(users as List<User>).joinToLine{ "<li>User ${it.firstname} ${it.lastname}</li>" }}
</ul>
${include("footer")}
"""

這個功能仍在進行中,但我正在與Kotlin團隊合作,暫時使其準備好對Spring Framework 5.0 GA上的巢狀模板和i18n在MVC和Reactive兩方面的支援。

結語

我使用Kotlin編寫Spring Boot應用程式越多,我覺得這兩種技術有著共同的目標,允許您使用表達性,簡短和可讀的程式碼來更高效地編寫應用程式,而Spring Framework 5 Kotlin支援將這些技術以更加自然,簡單和強大的方式來展現給我們。

Kotlin可以用來編寫 基於註解的Spring Boot應用程式 ,但作為一種新的 functional and reactive applications 也將是一種很好的嘗試,Spring Framework 5.0將會啟用。

Kotlin團隊做了一個偉大的工作,修復幾乎所有的bug點,我們報告,所以非常感謝他們。即將到來的Kotlin 1.1版本預計也修復 KT-11235 ,以允許指定陣列註解標記單個屬性值,無須使用 arrayOf() 。你將面臨的主要問題可能是 KT-14984 ,它將需要明確指定lambda型別(如 Supplier {} 或 HandlerFunction {} )其中只需指定 {} 應該就足夠了。

通過轉到 start.spring.io 並生成一個Spring Boot 2.0.0(SNAPSHOT) 專案,可以自由測試Spring Framework 5.0 Kotlin支援並在這裡或者在 Kotlin Slack 的“#spring”頻道向我們傳送您的反饋。你也可以貢獻你需要的Kotlin擴充套件;-)

相關推薦

Spring Framework 5.0引入Kotlin支援

 我們幾個月前有介紹關於 Kotlin在start.spring.io上的支援 ,我們有一直在進行工作,以確保Spring和 Kotlin 在一起玩得很好。 Kotlin的一個關鍵優勢是它提供了一個與用Java編寫的庫之間非常好的互操作性。但是有更多的方法可以進一步,允

Spring學習總結(23)——Spring Framework 5.0 新特性

Spring Framework 5.0 是自 2013年12月版本 4 釋出之後 Spring Framework 的第一個主發行版。Spring Framework 專案的領導人 Juergen

Spring Framework 5 的新特性

jpg 幹凈 map 避免 strong findbugs ora htm 習慣 Spring Framework 5 中的新特性 Spring 5 如何利用 Java 8 的函數式語法和一種新的反應式編程模型 Alex Theedom2017 年 10 月 18 日

Spring Framework 5.1.4, 5.0.12 and 4.3.22 釋出

   Spring Framework 5.1.4, 5.0.12 and 4.3.22 釋出,該版本是一個重要的改進版本,解決了 5.1 GA 以來的幾個問題。建議 5.1.x 使用者升級。 注意:5.0.12 版本是 5.0.x 的最後版本,5.0 版本將於2019年3月份

spring security 5.0 密碼未加密報錯

bean opp work 加密方式 user enc zhang dmi 之前 使用spring security5.0後,配置文件中直接寫普通的密碼如:123456,會報錯: java.lang.IllegalArgumentException: There is no

5.0redis-cli的集群管理測試

water 記得 bcb dff eba code copy 所有 mage 集群管理工具redis-trib.rb已經被廢棄,所以不用安裝ruby啥的了,當時redis-trib.rb的功能,現在已經集成到了redis-cli中,可以通過./redis-cli --clu

如何解決Android 5.0出現的警告:Service Intent must be explicit

有些時候我們使用Service的時需要採用隱私啟動的方式,但是Android 5.0一出來後,其中有個特性就是 Service Intent  must be explitict ,也就是說從Lollipop開始,service服務必須採用顯示方式啟動。

在Android 5 0使用JobScheduler

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring Security 5.0的DelegatingPasswordEncoder詳解

地理 The 不同的 fault wpa 存在 版本 直接 tex 本文參考自Spring Security 5.0.4.RELEASE 的官方文檔,結合源碼介紹了 DelegatingPasswordEncoder,對其工作過程進行分析並解決其中遇到的問題。包括 Ther

Spring5.0初始 jdbc 來呈現 耦合的問題

Spring 大概起始於 2002 年的 interface21 的: 這是 Spring前身的一個主要的標誌 9是j2EE 開發的, 拋棄了 不使用EJB 這次介紹的是Spring5.0 與 2017 年09月 釋出的 通用 (GA) Spring 都有那些優勢#####

WordPress 5.0的新功能(功能和截圖)

幾天前釋出了WordPress 5.0。它是2018年第一個也是唯一一個主要的WordPress版本,它帶來了一系列全新的改進和一些重大變化。在本文中,我們將向您展示WordPress 5.0中的新功能以及升級網站後應嘗試的功能。 WordPress 5.0是一個主要版本,除非您使用託

《Netty官方文件》5.0的變化和注意點

原文地址  譯者:葉揚V 這篇文件將引領你瞭解netty在4.1 release版本之後所做的一系列顯著升級和新特性,以便讓你能把應用升級到新版本。 不像netty在3.X和4.0之間的升級變化,5.0版本雖然在設計上做出了重大突破和簡化,但(在呼叫層面)並沒有改變很多。我們儘可能讓4.X版本

Spring Framework 4.0 遷移指南 (官方文件翻譯)

看到Spring Framework4.0釋出的訊息,看了下new future,OneCoder很喜歡spring這種追“時髦”的風格,groovy指令碼配置和Java8都支援了。順便就翻譯了一下官方的遷移指南。對一般使用來說,遷移沒什麼難度。

CDH5.5.0配置執行Spark SQL的Thrift Server

CDH5.5.0裡面閹割了spark-sql和sparkR,目錄裡面都沒有start-thriftserver.sh,哪怕是spark Standalone部署。 前面帖子講到,CDH5.5.0 spark-sql沒有的情況下,在一個節點部署外面社群版的spark1.5.

淺析Android 5.0多媒體相關的新特性

一、MediaBrowser API 二、使用MediaProjection對螢幕錄影 三、新的MediaStyle型別的通知(Notification) 四、MediaSession和MediaController 五、原生支援H.265軟解碼器

vue2.0 引入和使用 axios

vue2.0 中引入和使用 axios Axios 是一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。 Features 從瀏覽器中建立 XMLHttpRequests 從 node.js 建立 http 請求 支援 Prom

關於springspring-framework-3.0.2.RELEASE-dependencies.zip包的下載

今天在java 吧裡面發現了一個大神說,其實,ssh 已經綁架了我們java的新學者,首先,嘴面上我是不承認,但是我的內心不得不承認這是事實。ssh已經綁架了我們這些新學者,而我,作為一個新學者,竟然花費了一整個暑假在這三個框架上,說後悔,我倒不至於,但是呢,總是覺得,時間

Android 5.0使用JobScheduler 排程作業

原理請看這邊文章:http://blog.csdn.net/cuiran/article/details/42805057 本篇文章抄襲了這個作者的部分程式碼:http://blog.csdn.net/zhangyongfeiyong/article/details/514

Entity Framework 5.0系列之約定配置

Code First之所以能夠讓開發人員以一種更加高效、靈活的方式進行資料操作有一個重要的原因在於它的約定配置。現在軟體開發越來複雜,大家也都試圖將軟體設計的越來越靈活,很多內容我們都希望是可配置的,但是過多的配置也會帶來很大的工作量,解決這個問題的方法就是約定。對於一些簡

基於安卓5.0stateListAnimator自定義

在安卓5.0以後控制元件有一個stateListAnimator可以在xml中新增動畫集合 使用方式也很簡單:直接在佈局檔案中通過stateListAnimator引用自定義的select檔案即