众所周知,Spring的核心是ApplicationContext,它管理者bean的完整生命周期。当bean被加载的时候,ApplicationContext会发布一些事假类型。例如:context在启动的时候ContextStartedEvent事件会被发布,而当context在关闭的时候ContextStoppedEvent事件会被发布。
ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的。所以当bean实现了ApplicationListener接口,那么每次都会有一个ApplicationEvent被发布到ApplicationContext,bean也会被通知。
Spring提供了以下标准事件:
ContextRefreshEvent:这个事件会在ApplicationContext初始化和重新刷新的时候被触发。当然,改时间也会被ConfigurableApplicationContext接口的refresh()方法触发。
ContextStartedEvent:该事件会在使用ConfigurableApplicationContext接口的start()方法启动ApplicationContext的时候被触发。可以在接收到该事件之后关闭数据库连接或重新启动关闭的应用。
ContextStoppedEvent:该事件会在使用ConfigurableApplicationContext接口的stop()方法停用ApplicationContext的时候被触发。可以在接收到该事件之后处理一些必需的任务。
ContextClosedEvent:该事件会在使用ConfigurableApplicationContext接口的close()方法关闭ApplicationContext的时候被触发。关闭的context会接收到该事件来结束生命周期,这种关闭不能被重新启动。
RequestHandledEvent:该事件是特定于web的,会通知所有的bean收到一个HTTP请求。
Spring的事件处理是单线程的,所以当一个事件被触发,在事件被接受者获得之前,进程都会处于阻塞状态。所以,当设计应用时使用到事件处理的时候要特别注意对事件的处理。
Context事件监听:
为了监听context的事件,bean需要实现ApplicationListener接口,该接口只有一个onApplicationEvent()方法。
我们也可以声明个性化的事件,然后以相同的方式来捕获事件。
ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的。所以当bean实现了ApplicationListener接口,那么每次都会有一个ApplicationEvent被发布到ApplicationContext,bean也会被通知。
Spring提供了以下标准事件:
ContextRefreshEvent:这个事件会在ApplicationContext初始化和重新刷新的时候被触发。当然,改时间也会被ConfigurableApplicationContext接口的refresh()方法触发。
ContextStartedEvent:该事件会在使用ConfigurableApplicationContext接口的start()方法启动ApplicationContext的时候被触发。可以在接收到该事件之后关闭数据库连接或重新启动关闭的应用。
ContextStoppedEvent:该事件会在使用ConfigurableApplicationContext接口的stop()方法停用ApplicationContext的时候被触发。可以在接收到该事件之后处理一些必需的任务。
ContextClosedEvent:该事件会在使用ConfigurableApplicationContext接口的close()方法关闭ApplicationContext的时候被触发。关闭的context会接收到该事件来结束生命周期,这种关闭不能被重新启动。
RequestHandledEvent:该事件是特定于web的,会通知所有的bean收到一个HTTP请求。
Spring的事件处理是单线程的,所以当一个事件被触发,在事件被接受者获得之前,进程都会处于阻塞状态。所以,当设计应用时使用到事件处理的时候要特别注意对事件的处理。
Context事件监听:
为了监听context的事件,bean需要实现ApplicationListener接口,该接口只有一个onApplicationEvent()方法。
我们也可以声明个性化的事件,然后以相同的方式来捕获事件。