春のイベント駆動型

1.最も一般的な理解:

Spring IOCコンテナapplicationContextには、ApplicationEventMulticasterというコンポーネントがあります。マルチキャストは一連のリスナー(applicationListener)のコンテナです。applicationContextはpublishEvent()メソッドを実行してイベントを公開します。アクティブにforループでマルチキャストをトラバースします。リスナーリスナーのコールバックメソッドを実行します。


2.春に表示されるイベント:

1)Spring iocコンテナが更新されると、ContextRefreshedEventイベントが解放されます
。2)プロセス中に、イベントはプログラマのカスタムメソッドのapplicationContextを介して解放されます
。3)ContextClosedEventは、springiocコンテナが閉じられると解放されます。


3.スプリングモニタリングメカニズムを使用する手順:

1)リスナーを書く

方法1:
特定のイベント(ApplicationEventとそのサブクラス)をリッスンするリスナー(ApplicationListener実装クラス)を記述します
。送信2:
@EventListener;
原則:コンポーネントに@EventListenerメソッドが1つ含まれている場合は、EventListenerMethodProcessorプロセッサを使用してメソッドの@EventListenerを解決します。、このコンポーネントはリスナーです。

2)リスナーをコンテナーに追加します。

3)iocコンテナでリリースされた関連イベントがある限り、このイベントを聞くことができます

たとえば、iocコンテナの一部のシステムイベント:
ContextRefreshedEventイベント:このイベントは、コンテナが更新されたときに公開されます(すべてのBeanが完全に作成されます)
ContextClosedEventイベント:このイベントは、コンテナが閉じられたときに公開され
ます。対応するリスナーが実行されます。

4)春のiocコンテナはどのようにイベントを公開しますか?

applicationContext.publishEvent(事件)


4.イベントが公開された後(つまり、publishEvent()メソッドが実行された後)、何が起こりますか?

3)publishEvent(new ContextRefreshedEvent(this));
a)イベントのマルチキャスト(ディストリビューター)を取得します:getApplicationEventMulticaster()
b)マルチキャストはmulticastEvent()を呼び出してイベントをディスパッチします:
c)multicastEvent()の擬似コードロジック:

          //获取到所有订阅此事件的ApplicationListener;
		  for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
    
    
			  /*
			  a)如果有Executor,可以支持使用Executor进行异步派发;
				   Executor executor = getTaskExecutor();
			  b)否则,同步的方式直接执行listener方法:
			   invokeListener(listener, event),拿到listener回调onApplicationEvent(  )方法;
			  */

関連するソースコード:
ここに画像の説明を挿入


5.イベントマルチキャスト(ディスパッチャ)はいつ生まれますか?

1)iocコンテナにオブジェクトを作成します。refresh()メソッドを入力します
。2)refresh()にinitApplicationEventMulticaster()を入力します。これがApplicationEventMulticasterコンポーネントの初期化です。a
  )最初にコンテナに移動して、IDを持つコンポーネントがあるかどうかを確認します。 = [applicationEventMulticaster]、存在するものは何でもしないでください。
  b)そうでない場合は、this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory)を実行し、beanFactory.registerSingleton(String beanName、Object singletonObject)メソッドを介してイベントマルチキャストをiocコンテナーに追加します。


6.リスナーはいつイベントマルチキャストに保存されますか

1)コンテナ作成オブジェクト:refresh();を入力します
。2)refresh();にregisterListeners()を入力します。
単純なコード:

 	 //从容器中拿到所有的监听器,把他们注册到[ applicationEventMulticaster ]中;
	 String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
	 
	 //将listener注册到ApplicationEventMulticaster中
	 getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);

おすすめ

転載: blog.csdn.net/nangonghen/article/details/102059447