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提供了更多的注解支援。