我认为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-and context-context。如果我刷新子上下文,那么这个方法也会刷新父上下文。但它不能使用相同的ApplicationEvent对象,因为它包含引用上下文的source属性,它已被刷新:
/**
* 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应用程序中的一个错误,并试图找出一些组件没有收到刷新事件的原因。