Spring框架设计模式一:观察者模式

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,在被观察者里会维护一个观察者的集合,当被观察者的状态发生改变时会去遍历集合中的观察者去执行对应的操作。


Spring中的观察者:常用的地方是listener的实现,如ApplicationListener:


(1)ApplicationListener是观察者接口,接口中定义了onApplicationEvent方法,该方法的作用是对ApplicationEvent事件进行处理。ApplicationListener有四个实现类:

ConsoleListener,FrameworkServlet,PerformanceMonitorListener,SourceFilteringListener分别对事件做不同的处理(观察者的update操作),在这里就不详细展开。

(2)SimpleApplicationEventMulticaster是被观察者,它有个抽象父类AbstractApplicationEventMulticaster,在AbstractApplicationEventMulticaster中维护了一个applicationListeners(观察者集合),SimpleApplicationEventMulticaster通过遍历applicationListeners来执行各个listener中的onApplicationEvent,具体调用listener是通过线程池TaskExecutor来异步进行的:

	public void multicastEvent(final ApplicationEvent event) {
		for (Iterator it = getApplicationListeners().iterator(); it.hasNext();) {
			final ApplicationListener listener = (ApplicationListener) it.next();
			getTaskExecutor().execute(new Runnable() {
				public void run() {
					listener.onApplicationEvent(event);
				}
			});
		}
	}

前面讲了 SimpleApplicationEventMulticaster通知到ApplicationListener,然而这些ApplicationListener是通过父类AbstractApplicationEventMulticaster的addApplicationListener进行注册的,在AbstractApplicationContext进行refresh操作时会去调用registerListeners方法,registerListeners再去调用AbstractApplicationEventMulticaster的addApplicationListener方法进行注册。

被观察者SimpleApplicationEventMulticaster遍历观察者ApplicationListener进行相应操作是由业务需求方(如EventPublicationInterceptor)通过调用AbstractApplicationContext的publishEvent方法触发的。EventPublicationInterceptor的invoke代码:

	public Object invoke(MethodInvocation invocation) throws Throwable {
		Object retVal = invocation.proceed();

		ApplicationEvent event = (ApplicationEvent)
				this.applicationEventClassConstructor.newInstance(new Object[] {invocation.getThis()});
		this.applicationEventPublisher.publishEvent(event);

		return retVal;
	}

AbstractApplicationContext的 publishEvent方法:

	public void publishEvent(ApplicationEvent event) {
		Assert.notNull(event, "Event must not be null");
		if (logger.isTraceEnabled()) {
			logger.trace("Publishing event in context [" + getId() + "]: " + event);
		}
		getApplicationEventMulticaster().multicastEvent(event);
		if (this.parent != null) {
			this.parent.publishEvent(event);
		}
	}






  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值