gpt4 book ai didi

spring-boot - @AutoConfigureBefore 不触发

转载 作者:行者123 更新时间:2023-12-03 01:26:48 27 4
gpt4 key购买 nike

该项目的目的是在 Liquibase 之前创建 Spring Boot 生命周期的钩子(Hook)。执行其数据库模式变更集。这些钩子(Hook)最终将用于启动/停止具有 Postgres 实例的 Docker(或类似 Docker)容器。该项目必须能够处理:

  • 从 IDE(IntellIJ、STS)运行测试
  • 使用 Maven Surefire 运行测试
  • spring-boot:运行
  • 可执行 JAR
  • CI服务器上的集成测试

鉴于上述限制,最好的方法似乎是进行自动配置并指示其在 Liquibase 之前运行。

Auto-Configuration class已注释:

@ConditionalOnProperty(prefix = "docker_42", 
name = "enabled", matchIfMissing = false)
@AutoConfigureBefore({LiquibaseAutoConfiguration.class })
public class Docker42AutoConfiguration {

spring.factories有一个条目:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
nl._42.autoconfig.Docker42AutoConfiguration

整个(精简的)项目可以在这里找到:https://github.com/robert-bor/auto-configuration-question

结果可以通过以下任一方式验证:

  • 在 IDE 中设置项目并运行测试,或者
  • 执行 spring-boot:run

在 Spring Boot 的日志中,您将看到 Liquibase 在自定义自动配置之前执行。

请注意,我们已经尝试了各种其他路线(ApplicationListenerRunListener),但没有一个能够很好地满足所有必需的道路。

如果能指出为什么@AutoConfigureBefore在我的项目中不起作用,我们将非常感激。

最佳答案

您正在尝试将配置语义应用于某些运行时约束。自动配置是在上下文中提供bean 定义,最终将创建可连接到组件中的 bean 实例。

假设您需要 bean Foo 来自动配置某些内容。您需要确保 FooAutoConfiguration 在您之前运行,以便上下文有机会包含 Foo 的 bean 定义。我们的last Devoxx university对此进行了非常详细的解释。 .

您在该评论中引用的文档并不以任何方式暗示运行时限制:

Hint for that an auto-configuration should be applied before other specified auto-configuration classes.

应用自动配置并不意味着由该配置创建的 Bean 将在由另一个配置创建的 Bean 之前有效启动。换句话说,您所做的就是确保您的自动配置在 liquibase 自动配置有机会执行此操作之前配置了上下文。无论如何,这并不意味着将要创建的 bean(我们还没有做到)将按照该顺序创建。

如果这就是您想要做的,并且您没有 Bean 依赖项,那么您可以忘记所有这些并创建一个 Bean 生命周期依赖项。这可能很棘手,因为 liquibase 可能存在也可能不存在,但我们基本上是为 Hazelcast 这样做的(请参阅 the auto-configuration )。基本上我们需要确保 Hazelcast 在 JPA 容器启动之前启动,以防 JPA 容器想要使用 Hazelcast 作为二级缓存。

关于spring-boot - @AutoConfigureBefore 不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40727625/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com