天天看點

Spring4.2新特性(一)

1. 簡介.

前些天spring4.2出來了, 從ga開始就一直在跟了, 前2天看完了所有官方release notes, 覺得記錄下我比較感興趣的特性.

我看的是4.2ga, 4.2rc3, 4.2rc2, 4.2rc1。4.0和4.1的新特性, 可以看看濤哥的部落格。這裡主要是講照官方文檔裡面列的, changelog裡面太多了 -.-!

2. 核心改進.

1) @bean能注解在java8預設方法上了, 例如:

輸出: {main=main [name=main], getmain=main [name=iface]}

可以看到, 我們注解在java8預設方法上的@bean注解已經生效了.

2) 配置類上的@import以前隻能引入配置類(注解了@configuration等的類), 現在可以引入一般的元件了, 比如啥注解都沒有的類.

輸出: com.haogrgr.test.main.main$dao@7f77e91b.

在4.2之前, 會報如下錯誤:

exception in thread “main” org.springframework.beans.factory.parsing.beandefinitionparsingexception: configuration problem: com.haogrgr.test.main.main$dao was @import’ed but is not annotated with @configuration nor does it declare any @bean methods; it does not implement importselector or extend importbeandefinitionregistrar. update the class to meet one of these requirements or do not attempt to @import it.

offending resource: class com.haogrgr.test.main.main$dao

at org.springframework.beans.factory.parsing.failfastproblemreporter.error(failfastproblemreporter.java:70)

at org.springframework.context.annotation.configurationclassbeandefinitionreader.registerbeandefinitionforimportedconfigurationclass(configurationclassbeandefinitionreader.java:164)

3)配置類上現在可以注解@order了, 使其能按預期的順序來處理, 比如(通過名字來覆寫bean配置等).

輸出: submain, 可以通過修改order的值, 來使輸出為 main.

注: 4.2之前, 是根據annotationconfigapplicationcontext(main.class, submain.class) 初始化時參數的順序來處理的.

4) @resource注解的元素, 現在可以配合@lazy, 和@autowired一樣, 注入代理類, 來代理對應bean的請求.

輸出:

1. 沒加@lazy時:

com.haogrgr.test.main.scopedbean@525f1e4e

2. 加了@lazy後:

com.haogrgr.test.main.scopedbean@6293abcc

com.haogrgr.test.main.scopedbean@7995092a

可以看到, 主要是為了友善實作scope代理(或延遲擷取, 比如注入時還沒初始化等)情況, 也就是當singleton引用prototype時, 就需要@lazy.

5) application event那套現在提供注解支援了, 比如以前常用的appcontextutil(擷取context, 提供靜态方法擷取bean)現在可以這麼寫.

具體可以看這篇文章: http://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2

eventlistener的屬性value和classes一樣, 都是用來指定要處理的事件, condition屬性可以使用spel來過濾event

還一個就是@transactionaleventlistener, 可以友善我在事務周期内處理一些事情, 比如事務送出後觸發某一事件.

一個場景就是, 當插入記錄送出事務後, 異步發送消息到其他系統, 或本地記錄日志等操作, 現在可以通過transactionaleventlistener來做了.

注: 下面的代碼僅供參考, 如果要運作, 自己搭一個資料庫環境吧, 這裡隻貼了相關的代碼.

結果, 當調用addtestmodel() 時, 會輸出”haogrgr”。官方說的比較少, 看了下源碼才知道怎麼用, 内部是包裝一下@transactionaleventlistener注解的方法,添加了一個擴充卡, applicationlistenermethodtransactionaladapter,内部通過transactionsynchronizationmanager.registersynchronization 注冊一個同步器釋出事務時, 記下event, 然後注冊一個同步器transactionsynchronizationeventadapter,當事務送出後, transactionsynchronizationmanager會回調上面注冊的同步擴充卡,這裡注冊就是放入到一個threadlocal裡面, 通過它來透傳參數。這時,transactionsynchronizationeventadapter内部才會真正的去調用handle方法.

6) 提供@aliasfor注解, 來給注解的屬性起别名, 讓使用注解時, 更加的容易了解(比如給value屬性起别名, 更容易讓人了解).

可以看到, 可以讓注解中讓人困惑的value更加讓人了解, spring4.2中大量的注解都為value添加了别名.

7) 其他一些的改進, 不細說了, 主要是内部的改進, java8的stream, 日期等支援, javax.money等支援,

commons-pool2支援, 腳本加強等, hibernate5支援, jms增強 等等等等.

4. 總結

spring4.2提供了更多的注解支援。