发布网友 发布时间:2024-10-24 13:07
共1个回答
热心网友 时间:2024-10-30 17:13
业务需求下,需要程序初始化启动后自动执行一个持续运行的程序。这个自动执行的程序陷入死循环,不会停止。结果,其他所有接口在程序启动后都无法调用。排查时,尝试了重启服务、清空IDE缓存、重启电脑、换环境执行,问题均未得到解决。经过深入分析,发现问题出在使用了@PostConstruct注解的方法。
通过在每个方法中设置断点,发现在程序启动过程中,确实执行了带有@PostConstruct注解的方法。由于该方法的死循环特性,导致无法正常执行后续操作。为了验证问题,构建了一个测试工程,复现了相同问题。
查阅资料后了解到,SpringBoot启动过程涉及Bean的加载。SpringBoot会自动将标记为Bean的类或接口进行全局单例实例化。在实例化过程中,如果类或接口上存在@PostConstruct注解,SpringBoot会在构造方法执行完成后,执行该注解标注的方法,然后实例化下一个Bean。若@PostConstruct注解方法执行时间过长,会显著影响Bean实例化的时间,进而影响程序初始化启动。若初始化未完成,程序将无法启动并提供服务,因此在@PostConstruct注解的方法执行之前,应用无法访问。
总结,对于较轻量级的逻辑,可以考虑放置在@PostConstruct注解的方法中。对于消耗时间过长的逻辑,建议使用多线程处理,或放弃@PostConstruct注解,转而采用CommandLineRunner和ApplicationRunner。这样,可以确保程序在所有Bean初始化完毕后正常启动,并提供服务。