ApplicationContext的事件机制

简单例子

完成事件机制首先需要一个事件源和事件监听器
ApplicationEvent事件和ApplicationListener监听器

1
2
3
4
5
6
7
8
9
10
11
public class SayEvent extends ApplicationEvent {
public void say(){
System.out.println(this.getSource()+" : hello world");
}
}
public class SayListener implements ApplicationListener<SayEvent> {
@Override
public void onApplicationEvent(SayEvent sayEvent) {
sayEvent.say();
}
}

并且要在xml文件中配置好ApplicationListener监听器

1
2
3
<beans>
<bean class="com.ahao.javaeeDemo.SayListener" />
</beans>

通过ApplicationContext发布事件

1
2
3
4
5
6
@Test
public void testEvent(){
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-bean.xml");
SayEvent event = new SayEvent("由testEvent()发出");
ac.publishEvent(event);
}

Spring的事件监听机制是观察者模式的实现。
监听器可以监听任何事件。
输出结果:由testEvent()发出 : hello world

内置事件

Spring提供如下几个内置事件:

  1. ContextRefreshedEventApplicationContext容器初始化或刷新时触发该事件。此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用

  2. ContextStartedEvent:当使用ConfigurableApplicationContext(ApplicationContext的子接口)接口的start()方法启动ApplicationContext容器时触发该事件。容器管理声明周期的Bean实例将获得一个指定的启动信号,这在经常需要停止后重新启动的场合比较常见

  3. ContextClosedEvent:当使用ConfigurableApplicationContext接口的close()方法关闭ApplicationContext时触发该事件

  4. ContextStoppedEvent:当使用ConfigurableApplicationContext接口的stop()方法使ApplicationContext容器停止时触发该事件。此处的停止,意味着容器管理生命周期的Bean实例将获得一个指定的停止信号,被停止的Spring容器可再次调用start()方法重新启动

  5. RequestHandledEventWeb相关事件,只能应用于使用DispatcherServletWeb应用。在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件。

参考资料