我在我的服务中使用 Spring
ApplicationEventListener
来执行启动时逻辑。我知道,我可以在方法上使用 @PostConstruct
注释,但是,由于测试逻辑原因,它不能应用于我的代码。这是我的听众:
@Component
@RequiredArgsConstructor
@Slf4j
public class ApplicationStartupListener implements ApplicationListener<ApplicationReadyEvent> {
private final SubscriptionService subscriptionService;
@Override
public void onApplicationEvent(final ApplicationReadyEvent event) {
subscriptionService.onStart();
}
}
它不起作用(但
@PostConstruct
确实有效) - 即使我在方法级别或其中有一个断点 - 似乎没有发生ApplicationReadyEvent
。我尝试用 @EventListener(ApplicationReadyEvent.class)
注解替换该方法,但仍然没有效果。调试模式和事件更改都不起作用,我不知道为什么会发生这种情况。希望得到答案,有任何问题请随时提问:)
下面是正常工作的堆栈信息。
onApplicationEvent:14, ApplicationStartupListener ()
onApplicationEvent:8, ApplicationStartupListener ()
doInvokeListener:176, SimpleApplicationEventMulticaster (org.springframework.context.event)
invokeListener:169, SimpleApplicationEventMulticaster (org.springframework.context.event)
multicastEvent:143, SimpleApplicationEventMulticaster (org.springframework.context.event)
publishEvent:421, AbstractApplicationContext (org.springframework.context.support)
publishEvent:378, AbstractApplicationContext (org.springframework.context.support)
ready:114, EventPublishingRunListener (org.springframework.boot.context.event)
lambda$ready$6:82, SpringApplicationRunListeners (org.springframework.boot)
accept:-1, 1090171402 (org.springframework.boot.SpringApplicationRunListeners$$Lambda$2028)
forEach:1541, ArrayList (java.util)
doWithListeners:120, SpringApplicationRunListeners (org.springframework.boot)
doWithListeners:114, SpringApplicationRunListeners (org.springframework.boot)
ready:82, SpringApplicationRunListeners (org.springframework.boot)
run:322, SpringApplication (org.springframework.boot)
main:31, Application ()
请检查:
ApplicationStartupListener
是由Spring Boot创建的。最简单的方法是删除@RequiredArgsConstructor
并添加一个带断点的构造函数,如果执行到这里就意味着创建了。SpringApplicationRunListeners.ready
函数处添加断点,确保您的应用程序真正准备好。