JFinal-event v2.3.0 釋出,簡化 Event 事件類

如夢技術發表於2019-04-08

說明

JFinal-event 2.x 參考 Spring 4.2.xEvent 的使用方式而生,為 JFinal 使用者帶來更多方便。其核心目標是深層次解耦,為您節約更多時間,去陪戀人、家人和朋友 :)

年初 @idoz 提議實現類似 Spring 4.2 裡的 PayloadApplicationEvent,其實我早就有此想法,一直沒有抽出時間來折騰。

順便在 碼雲上新增了 issues 3.0優化,有2點功能:

第一點,實現 PayloadApplicationEvent 不難。擴充套件個 EventType

class1 為 ApplicationEvent 類 或者 PayloadApplicationEvent類資訊 class2 為 ApplicationEvent 泛型,或者 Payload 中的類資訊

第二點,將類掃描改為 annotation Processor 編譯期處理(避免容器環境差異)

由於 @EventListener 註解可以在任何方法中,annotation Processor 需要掃描 *,然後 找出 對應的含有 @EventListener 方法的類,然後寫入 META-INF/dream.events 檔案中。

本次版本升級完成了第一點,第二點由於覺得更加適合底層框架去實現,從而方便擴充套件,對於 annotation Processor 感興趣的朋友可以瞭解我的開源 mica-auto

更新說明

2019-04-08 v2.3.0

  • 升級到 jfinal 3.8。
  • 支援 @EventListener 方法可以無引數。
  • ObjenesisBeanFactory 和 jfinal Aop inject 衝突,去掉對 JFinal inject 支援,標記為棄用。
  • 新增 SourceClass 作為 event 事件源(同 Spring PayloadApplicationEvent),event模型不再需要實現 ApplicationEvent
  • @EventListener 註解新增 value 變數,功能同 events。
  • 修復 @EventListener events 引數型別判斷bug。

初始化外掛

// 初始化外掛
EventPlugin plugin = new EventPlugin();
// 設定為非同步,預設同步,或者使用`threadPool(ExecutorService executorService)`自定義執行緒池。
plugin.async();

// 設定掃描jar包,預設不掃描
plugin.scanJar();
// 設定監聽器預設包,多個包名使用;分割,預設全掃描
plugin.scanPackage("net.dreamlu");
// bean工廠,預設為DefaultBeanFactory,可實現IBeanFactory自定義擴充套件
// 對於將@EventListener寫在不含無參構造器的類需要使用`ObjenesisBeanFactory`(2.3.0 已經不推薦使用)
plugin.beanFactory(new ObjenesisBeanFactory());

// 手動啟動外掛,用於main方法啟動,jfinal中不需要,新增外掛即可。
plugin.start();

// 停止外掛,用於main方法測試
plugin.stop();
複製程式碼

新建事件類(任意模型即可 2.3.0支援)

public class AccountEvent {

	private Integer id;
	private String name;
	private Integer age;

	// 省略 get set

}
複製程式碼

編寫監聽

@EventListener
public void listenTest1Event(AccountEvent event) {
    System.out.println("AccountEvent:" + event);
}
複製程式碼

傳送事件

AccountEvent event = new AccountEvent();
event.setId(1);
event.setName("張三");
event.setAge(18);

EventKit.post(event);
複製程式碼

@EventListener註解說明

示例

@EventListener(events = Test1Event.class, order = 1, async = true, condition = "event.isExec()")
複製程式碼

說明

  • valueevents支援的事件型別陣列,用於將事件方法定義為ApplicationEvent或者自定義父類。
public class Test {

    // Test1Event, Test2Event 為 TestEvent 子類
    @EventListener({Test1Event.class, Test2Event.class})
    public void applicationEvent(TestEvent event) {
        System.out.println(Thread.currentThread().getName() + "\tevent:" + event);
    }
}
複製程式碼
  • order排序,數值越小越先執行,預設為Integer.MAX_VALUE
  • async非同步執行,需要外掛開啟async()或者自定義執行緒池。
  • condition表示式條件,使用event.xxxx,event.isExec() == true判定event的屬性或者方法。

jar依賴

jar包下載 central.maven.org/maven2/net/…

以上版本均已上傳到maven倉庫~

<dependency>
    <groupId>net.dreamlu</groupId>
    <artifactId>JFinal-event</artifactId>
    <version>2.3.0</version>
</dependency>
複製程式碼

開源推薦

關注我們

如夢技術-公眾號.jpg

掃描上面二維碼,更多精彩內容每天推薦!

相關文章