问题描述
希望在系统启动时,或启动后立即触发事件(即context.publishEvent(event))但在InitializingBean的afterPropertiesSet方法和BeanPostProcessor的postProcessAfterInitialization方法里触发的事件仍然无效,请问该用什么样的方式触发事件呢?问题补充:1, 实现ApplicationContextAware拿到ApplicationContext来触发事件;2, 实现ApplicationListener接口来接收事件但是在系统启动过程中,或启动后无法立即触发事件,或者说是触发事件无效。实现InitializingBean后,在afterPropertiesSet方法中触发,或在实现BeanPostProcessor后,在postProcessAfterInitialization中触发,事件都无法传递到实现ApplicationListener的Bean中,只是在系统加载完成后,事件可以正常触发(如在执行某个客户端的请求时,可以很正常地触发事件)其实我就想在系统启动完成后再通过触发事件来初始化另外一些代码。问题补充:感觉我的代码跟 小疯子 提供的代码没什么不一样,但我的事件在afterPropertiesSet里就是无法触发成功。我再试试
解决方案
public class Tigger implements InitializingBean, ApplicationContextAware {private ApplicationContext applicationContext;public void afterPropertiesSet() throws Exception {this.applicationContext.publishEvent(new TiggerEvent(new Object()));}public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}}public class TiggerEvent extends ApplicationEvent {private String name = "fuxueliang";public String getName() {return name;}public TiggerEvent(Object source) {super(source);}}public class TiggerListener implements ApplicationListener {public void onApplicationEvent(ApplicationEvent event) {if (event instanceof TiggerEvent) {TiggerEvent tiggerEvent = (TiggerEvent) event;System.out.println("+++++++++++++" + tiggerEvent.getName() + "++++++++++++++++");}}}<bean class="com.TiggerListener" /><bean class="com.Tigger" />三块代码, 一个配置, 启动的时候, 就打出了:+++++++++++++fuxueliang++++++++++++++++不知道你是怎么实现的?
解决方案二:
不知道你是怎么触发的!你可以看下Spring Reference的第3.8.3章[Events], 有详细的介绍!主要就是两点:1, 实现ApplicationContextAware拿到ApplicationContext来触发事件;2, 实现ApplicationListener接口来接收事件