事件机制在java的设计模式中也可以叫监听器模式或者是观察者模式。 当有事件发生时,通知关注次事件的对象发送消息,告诉它有一个事件发生了,那么怎么知道通知谁呢? 那必须要在对这个事件感兴趣的对象中定义这个事件,一旦有事件发生了,对事件有兴趣的对象就知道了。
首先,使用事件机制有什么好处呢?我觉得最重要的一点就是避免了在代码中到处添加相同代码的问题,而且也可以对程序进行松耦合的设计。那么我们什么时候用事件机制呢?第一,当有多个代码块中需要引用相同代码的时候。第二,发生的这个操作或者代码不需要立即执行的,可以异步的。
SpringBoot中支持的事件类型定在org.springframework.boot.context.event包中,目前支持的事件类型有如下6种:
-
ApplicationFailedEvent
-
ApplicationPreparedEvent
-
ApplicationReadyEvent
-
ApplicationStartedEvent
-
SpringApplicationEvent
-
ApplicationEnvironmentPreparedEvent
ApplicationStartedEvent:
spring boot 启动监听类。
可以在SpringApplication启动之前做一些手脚,比如修改SpringApplication实例对象中的属性值
ApplicationEnvironmentPreparedEvent:
环境事先准备,spring boot中的环境已经准备ok
可以通过ApplicationEnvironmentPreparedEvent获取到SpringApplication、ConfigurableEnvironment等等信息, 可以通过ConfigurableEnvironment实例对象来修改以及获取默认的环境信息。
ApplicationPreparedEvent:
上下文准备事件。spring boot上下文context创建完成,但此时spring中的bean是没有完全加载完成的。可以通过ApplicationPreparedEvent获取到ConfigurableApplicationContext实例对象。ConfigurableApplicationContext类继承ApplicationContext类,但需要注意这个时候spring容器中的bean还没有被完全的加载,因此如果通过ConfigurableApplicationContext获取bean会报错的。
比如报错:Exception in thread "main" java.lang.IllegalStateException: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@69b0fd6f has not been refreshed yet
ApplicationReadyEvent:
上下文已经准备ok。这个时候就可以通过ApplicationReadyEvent获取ConfigurableApplicationContext,然后通过ConfigurableApplicationContext 获取bean的信息。
ApplicationFailedEvent:
spring boot启动异常时执行事件。可以通过ApplicationFailedEvent 获取Throwable实例对象获取异常信息并处理。
在异常发生时,最好是添加虚拟机对应的钩子进行资源的回收与释放,能友善的处理异常信息。
SpringApplicationEvent:
SpringApplicationEvent:获取SpringApplication事件
如果想定义自定义事件,请参照下面文章
https://my.oschina.net/sdlvzg/blog/1594444