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