Java 弹簧&x27;s@DependsOn不处理应用程序事件?
我得到了一个发送应用程序事件的类。接收方不得错过此事件,因此发送方依赖于接收方Java 弹簧&x27;s@DependsOn不处理应用程序事件?,java,spring,Java,Spring,我得到了一个发送应用程序事件的类。接收方不得错过此事件,因此发送方依赖于接收方 @Service @DependsOn("receiver") class Sender { ... @PostConstruct public void init(){ applicationEventPublisher.publishEvent(new MyEvent()); } } @Service class Receiver { ... @EventLi
@Service
@DependsOn("receiver")
class Sender {
...
@PostConstruct
public void init(){
applicationEventPublisher.publishEvent(new MyEvent());
}
}
@Service
class Receiver {
...
@EventListener
public void onEvent(MyEvent event) {
System.out.println("Event catched");
}
}
在调试模式下,您可以看到发送方
在接收方
之后被初始化,这将导致接收方始终捕获发送方的事件,但事实并非如此
事实上,在初始化接收器和它准备接收事件之间似乎存在延迟。如果我将事件在发送方中的发布延迟几毫秒,则接收方会按预期捕获它
因此,@DependsOn
似乎不能完全确保Seceiver在发送方之前已完全初始化,这与所记录的完全相反
如何在不使用任何难看的延迟的情况下实现接收器捕获事件?正如@M.Deinum所建议的,您所面临的问题是应用程序上下文在此时还没有准备好侦听事件 触发的事件可以在BeanFactoryPostProcessor()完成后处理。在调用BeanFactoryPostProcessor之前会调用postConstruct注释,这将导致事件处理丢失。(参考) 作为一种解决方案,您的bean可以在applicationContext启动()时触发事件
正如@M.Deinum所建议的,您所面临的问题是应用程序上下文此时还没有准备好侦听事件 触发的事件可以在BeanFactoryPostProcessor()完成后处理。在调用BeanFactoryPostProcessor之前会调用postConstruct注释,这将导致事件处理丢失。(参考) 作为一种解决方案,您的bean可以在applicationContext启动()时触发事件
不使用
@EventListener
。只要bean准备好,@PostConstruct
就会触发,这并不意味着所有bean(工厂)后处理器都已经完成了对bean的处理。这是使用@EventListener
时需要的。如果您收到ContextRefreshedEvent
或不使用@PostConstruct
实现SmartInitializingSingleton
,您可能会自己监听事件并触发,尽管这仍然不能真正保证所有事件都经过了后处理。不使用@EventListener
。只要bean准备好,@PostConstruct
就会触发,这并不意味着所有bean(工厂)后处理器都已经完成了对bean的处理。这是使用@EventListener
时需要的。如果您收到ContextRefreshedEvent
或不使用@PostConstruct
实现smartinitializesingleton
,您可能会自己监听事件并触发,尽管这仍然不能真正保证您已经对所有内容进行了后期处理。
@Service
class Sender {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@EventListener
public void applicationStarted(ContextRefreshedEvent event) {
applicationEventPublisher.publishEvent(new MyEvent());
}
}