Spring的事件機制詳解

2022-07-04 09:51:08 字數 3157 閱讀 4473

同步事件:在乙個執行緒裡,按順序執行業務,做完一件事再去做下一件事.

非同步事件:在乙個執行緒裡,做乙個事的同事,可以另起乙個新的執行緒執行另一件事,這樣兩件事可以同時執行.

用乙個例子來解釋同步事件和非同步事件的使用場景,有時候一段完整的**邏輯,可能分為幾部分,拿最常見的註冊來說,假設完整流程是,1.點選註冊->2.檢驗資訊並存庫->3.傳送郵件通知->4.返回給使用者.**這麼寫是正確,但不是最好的,缺點如下:

1.邏輯複雜,業務耦合,我們把校驗資料並存庫和傳送郵件寫到乙個大的業務方法裡了,發郵件我們可以看做乙個相對獨立的業務方法

2.效率低,假設2和3分別需要1秒的時候,那麼使用者在點選註冊2秒後才能看到相應

同步事件可以解決上面第乙個問題,我們把發郵件的方法獨立出來,放到事件裡執行,這樣註冊的這個方法就可以只做2操作,完成之後發布乙個事件去執行3,可以很好的解決業務耦合的問題.

非同步事件可以完美解決以上兩個問題,註冊方法執行2操作,執行之後發布乙個非同步事件,另起乙個執行緒執行3操作,註冊方法所在的執行緒可直接返回給使用者,這樣不僅實現了業務解耦還提高了效率,使用者點選註冊,1秒後就能看到響應.

spring事件傳送監聽涉及3個部分

接下來使用spring的非同步事件機制來模擬上面的註冊流程.有配置檔案和註解兩種方式.

1

public

class testevent extends23

private

testparam source;45

public

testevent(testparam source) 9}

1011

@data

12public

class

testparam

1

@component

2public34

@override

5public

void

67 testparam param =(testparam) testevent.getsource();

8 system.out.println(".......開始.......");

9 system.out.println("傳送郵件:"+param.getemail());

10 system.out.println(".......結束.....");11}

12 }

@component

public

class testpublish implements

private

static

@override

public

void

}public

static

void

}}

1

<

bean

idclass

>

2<

property

name

="taskexecutor"

>

3<

bean

class

="org.springframework.scheduling.concurrent.threadpooltaskexecutor"

>

4<

property

name

="corepoolsize"

value

="5"

/>

5<

property

name

="keepaliveseconds"

value

="3000"

/>

6<

property

name

="maxpoolsize"

value

="50"

/>

7<

property

name

="queuecapacity"

value

="200"

/>

8bean

>

9property

>

10bean

>

注意:如果加使用@async需要在配置檔案新增一下支援,執行緒池也是需要配置一下的

<

aop:aspectj-autoproxy

proxy-target-class

="true"

/>

<

task:executor

id="executor"

pool-size

="10"

/>

<

task:annotation-driven

executor

="executor"

proxy-target-class

="true"

/>

testlistener中在方法中新增@async

1

@component

2public

34@async

5

@override

6public

void

78 testparam param =(testparam) testevent.getsource();

9 system.out.println(".......開始.......");

10 system.out.println("傳送郵件:"+param.getemail());

11 system.out.println(".......結束.....");12}

13 }

1

@component

2public

class

testeventhandler

13 }

測試及控制台的列印就不貼了,這裡主要記錄一下具體的實現方法.

使用spring事件機制能很好地幫助我們消除不同業務間的耦合關係,也可以提高執行效率,應該根據業務場景靈活選擇.

Spring事件機制

使用spring事件機制能很好地幫助我們消除不同業務間的耦合關係,也可以提高執行效率,應該根據業務場景靈活選擇.event 說明 contextstartedevent 當容器啟動時發布,即呼叫start 方法,已啟用意味著所有的lifecycle bean都已顯式接收到了start訊號 conte...

Spring的事件機制

data public class myevent extends 複製 public class mylistener implements springboot的啟動類中新增 public static void main string args 複製 component slf4j publi...

使用Spring的事件機制

其次就需要去定義事件,例如流程結束事件,乙個購物系統當訂單流程已經結束了,我們需要通知發貨員發貨,這個時候我們的這個通知發貨,就是乙個觀察者,我們需要實現通知,比如簡訊,郵件通知,來告知物流 下面這幅圖,是我畫的很簡單的乙個圖,這就是核心的方法和核心的類。img 然後我們看看源 是怎麼做的 樣例 自...