@AutoConfigureBefore不会触发

时间:2016-11-21 19:11:35

标签: spring-boot

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

  • 测试从IDE(IntellIJ,STS)
  • 运行
  • 使用Maven Surefire进行测试
  • 弹簧引导:运行
  • 可执行文件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在我的项目中不起作用的指示非常感谢。

1 个答案:

答案 0 :(得分:6)

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

假设您需要bean Foo才能自动配置某些内容。您需要确保FooAutoConfiguration在您之前运行,以便上下文有机会包含Foo的bean定义。我们在last Devoxx university中详细解释了这一点。

您在该注释中引用的文档并未以任何方式暗示运行时约束:

  

提示应该在其他指定的自动配置类之前应用自动配置。

应用自动配置并不意味着该配置创建的bean将在另一个配置创建的bean之前有效启动。换句话说,您所做的就是确保自动配置在liquibase自动配置有机会之前配置上下文。它并不意味着将以该顺序创建将要创建的bean(我们还没有)。

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