java观察者模式在spring中的应用_Spring中经典设计模式之观察者模式

b001c076831dede3200d96a98d166857.png

实现方式:

spring的事件驱动模型使用的是观察者模式 ,Spring中Observer模式常用的地方是listener的实现。

具体实现:

事件机制的实现需要三个部分,事件源,事件,事件监听器

ApplicationEvent抽象类[事件]

继承自jdk的EventObject,所有的事件都需要继承ApplicationEvent,并且通过构造器参数source得到事件源.

该类的实现类ApplicationContextEvent表示ApplicaitonContext的容器事件.

代码:

public abstract class ApplicationEvent extends EventObject{ private static final long serialVersionUID = 7099057708183571937L; private final long timestamp; public ApplicationEvent(Object source){ super(source); this.timestamp = System.currentTimeMillis(); } public final long getTimestamp(){ return this.timestamp; }}

ApplicationListener接口[事件监听器]

继承自jdk的EventListener,所有的监听器都要实现这个接口。

这个接口只有一个onApplicationEvent()方法,该方法接受一个ApplicationEvent或其子类对象作为参数,在方法体中,可以通过不同对Event类的判断来进行相应的处理。

当事件触发时所有的监听器都会收到消息。

代码:

public interface ApplicationListener extends EventListener{ void onApplicationEvent(E event);}

ApplicationContext接口[事件源]

ApplicationContext是spring中的全局容器,翻译过来是”应用上下文”。

实现了ApplicationEventPublisher接口。

职责:

负责读取bean的配置文档,管理bean的加载,维护bean之间的依赖关系,可以说是负责bean的整个生命周期,再通俗一点就是我们平时所说的IOC容器。

代码:

public interface ApplicationEventPublisher { void publishEvent(ApplicationEvent event);}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); }}

ApplicationEventMulticaster抽象类[事件源中publishEvent方法需要调用其方法getApplicationEventMulticaster]

属于事件广播器,它的作用是把Applicationcontext发布的Event广播给所有的监听器.

代码:

public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext, DisposableBean{ private ApplicationEventMulticaster applicationEventMulticaster; protected void registerListeners(){ // Register statically specified listeners first.for (ApplicationListener> listener : getApplicationListeners()) {getApplicationEventMulticaster().addApplicationListener(listener);}// Do not initialize FactoryBeans here: We need to leave all regular beans// uninitialized to let post-processors apply to them!String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);for (String lisName : listenerBeanNames) {getApplicationEventMulticaster().addApplicationListenerBean(lisName);}}}

f74476f59228721cd4ed7ee0e9b9bd67.png

你点的每个“在看”,我都当成了喜欢

83e520afd390de9af2bb14298fa814b8.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值