Java 确保在Web服务器在spring引导中公开HTTP之前执行代码

Java 确保在Web服务器在spring引导中公开HTTP之前执行代码,java,spring,spring-boot,Java,Spring,Spring Boot,在SpringBootWeb应用程序中,是否可以确保在嵌入式web服务器(tomcat)侦听传入请求之前执行一些代码 我有一些数据库迁移脚本需要在应用程序响应RESTAPI的任何请求之前运行。我该怎么做?目前,我的迁移脚本组件将@EventListener用于ContextRefreshedEvent,但这太晚了。之前已记录了以下行: o、 s.b.w.embedded.tomcat.TomcatWebServer:tomcat已在端口8091(http)上启动,上下文路径为“” 您可以在bea

在SpringBootWeb应用程序中,是否可以确保在嵌入式web服务器(tomcat)侦听传入请求之前执行一些代码

我有一些数据库迁移脚本需要在应用程序响应RESTAPI的任何请求之前运行。我该怎么做?目前,我的迁移脚本组件将
@EventListener
用于
ContextRefreshedEvent
,但这太晚了。之前已记录了以下行:

o、 s.b.w.embedded.tomcat.TomcatWebServer:tomcat已在端口8091(http)上启动,上下文路径为“”


您可以在bean中使用@PostConstruct方法连接到数据库(存储库),并在那里编写运行脚本所需的代码,这些代码将在创建bean之后但在服务器运行之前执行


示例:

我最终使用了以下方法:

@Component
public class MigrationLogic implements SmartInitializingSingleton {

    @Override
    @Transactional
    public void afterSingletonsInstantiated() {
        // run your logic here, declare dependencies with @Autowired
    }

}

SmartInitializingSingleton
在web服务器启动之前执行。

考虑使用flyway,例如,它与springboot有很好的集成,并在服务器开始使用Neo4j之前运行您需要的所有迁移脚本,这将是Liquigraph,但我已经对我的迁移部分很满意,它工作得很好,只是运行得太晚了。但是谢谢你的指针。服务器是如何在bean构造之后运行的呢?我尝试了
@PostContstruct
,它正在工作,谢谢。顺序是正确的。仍然想知道这是巧合还是巧合。它必须在服务器开始处理请求之前执行,因为正如文档所说的,这个方法是在bean初始化之后执行的,并且服务器在创建spring上下文并初始化所有bean之前不会运行。很抱歉,这不起作用。当我声明迁移所需的所有依赖项时,@PostConstruct方法在tomcat初始化后被调用。我不完全确定为什么在服务器初始化后执行它,无论如何对于这种任务,我认为最好的选择是使用flyway或liquidbase,它是专门为此任务设计的,确保在初始化之前执行