Spring中事件机制学习总结

spring事件驱动模型学习整理
我们在使用spring进行开发的时候,会有一些这样的需求,就是当我们在某些事件发生后,对这些事件有对应的相应来进行数据处理。以往可能会通过观察者模式来进行相关的实现,被观察者实现相关的事件,而观察者订阅被观察者的事件来完成我们想要处理的逻辑。那么我们还有没有什么方式来达到同样的效果呢?其实是有的,spring内部提供了事件响应机制我们可以直接就哪来使用,spring是不是很强大,我们有跟多功能可以来用,但这个前提是我们要不断对spring进行深挖,好了,下面我们来说说spring的事件模型,使用事件模型非常方便,我们只要以下几个步骤就可以了。
1.实现自定义事件集成ApplicationEvent类。
2.在业务类中定义上面自定义的事件类,然后通过ApplicationContext发布publishEvent
  发布我们定义的事件。
3.自定义监听接口实现ApplicationListener<自定义Event>实现具体的响应逻辑。注意这里
  逻辑可以异步执行 @Async。
通过以上3个步骤就可以完成事件通知的处理方式,是不是很牛,但这不是所有,spring同样提供了更加智能的监听程序,可以完成更高级的一些需求,SmartApplicationListener这类可以指定更多的约定,更安全的实现业务逻辑。这个接口可以决定的有以下内容:
1.约定支持的事件类型。
2.约定事件的参数类型。
3.约定事件的优先级。
4.约定事件的业务逻辑。

applicationContext.publishEvent()方法,需要同步等待各个监听器处理完之后,才返回。也就是说,Spring提供的事件机制,默认是同步的。如果想用异步的,可以自己实现ApplicationEventMulticaster接口,并在Spring容器中注册id为applicationEventMulticaster的Bean。ApplicationContext的发布事件,ApplicationContext自动到本地容器里找一个名字为
ApplicationEventMulticaster实现,如果没有自己new一个SimpleApplicationEventMulticaster。其中SimpleApplicationEventMulticaster也是AbstractApplicationEventMulticaster类唯一的默认实现,我们可以直接new一个SimpleApplicationEventMulticaster并制定bean的名称为applicationEventMulticaster即可,想要改为异步仅需要传入对应的Executor即可。

/**
	 * Initialize the ApplicationEventMulticaster.
	 * Uses SimpleApplicationEventMulticaster if none defined in the context.
	 * @see org.springframework.context.event.SimpleApplicationEventMulticaster
	 */
	protected void initApplicationEventMulticaster() {
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
			this.applicationEventMulticaster =
					beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
			if (logger.isTraceEnabled()) {
				logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
			}
		}
		else {
			this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
			beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
			if (logger.isTraceEnabled()) {
				logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
						"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
			}
		}
	}
/**
	 * Name of the ApplicationEventMulticaster bean in the factory.
	 * If none is supplied, a default SimpleApplicationEventMulticaster is used.
	 * @see org.springframework.context.event.ApplicationEventMulticaster
	 * @see org.springframework.context.event.SimpleApplicationEventMulticaster
	 */
	public static final String APPLICATION_EVENT_MULTICASTER_BEAN_NAME = "applicationEventMulticaster";

 以上是AbstractApplicationContext类中的默认初始化过程,我们看是不是很清楚,他默认没有指定线程池,而直接创建了对应的对象,所以直接使用的是同步的方式,那么我们在使用的时候需要根据实际业务进行传递相应的线程模型来实现异步执行。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值