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);