クラス AbstractApplicationContext のメソッド publishEvent にバグがあると思います:
public void publishEvent(ApplicationEvent event) {
Assert.notNull(event, "Event must not be null");
if (logger.isTraceEnabled()) {
logger.trace("Publishing event in " + getDisplayName() + ": " + event);
}
getApplicationEventMulticaster().multicastEvent(event);
if (this.parent != null) {
this.parent.publishEvent(event);
}
}
MVC アプリケーションには、spring-context-hierarchy、root-context、child-context があります。子コンテキストを更新すると、このメソッドは親コンテキストも更新します。ただし、更新されたコンテキストを参照するソース プロパティが含まれているため、同じ ApplicationEvent オブジェクトでそれを実行してはなりません。
/**
* Create a new ApplicationEvent.
* @param source the component that published the event (never {@code null})
*/
public ApplicationEvent(Object source) {
super(source);
this.timestamp = System.currentTimeMillis();
}
したがって、親(ルート)コンテキストがイベントを送信し、子コンテキストが更新されたと言うのは間違っていると思います。たとえば、このプロパティを使用してイベントを配信するかどうかを決定するクラス SourceFilteringListener があります。
public void onApplicationEvent(ApplicationEvent event) {
if (event.getSource() == this.source) {
onApplicationEventInternal(event);
}
}
私の仮定は正しいですか(そしてそれはバグです)??? 私がそう思う理由は、MVC アプリケーションのバグを調査し、一部のコンポーネントが更新イベントを受信しなかった理由を見つけようとするためです。