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());
        }


    }