确保 Spring Boot 自定义启动器自动配置中的顺序

问题描述 投票:0回答:1

我正在编写一个自定义 Spring Boot 启动器,需要检查客户端应用程序上下文中的某些要求。我在

@Conditional
评估时使用自定义条件类执行此操作。这些条件之一需要检查是否存在 Postgres 连接的数据源。问题是我似乎找不到一种方法来确保创建数据源后评估条件,即使几秒钟后就可用了。

为了确保在

@Conditional
评估时拥有可行的上下文,我使用了两个链接的自动配置类:第一个加载“上下文验证 bean”,第二个执行实际工作。像这样:

@AutoConfiguration
@EnableConfigurationProperties(OutboxStarterProperties.class)
public class ContextInitAutoconfiguration {

    @Bean
    public ContextManager outboxContextRequirementValidator(
            Environment environment,
            ApplicationContext applicationContext
    ){
        return new ContextManager(environment, applicationContext);
    }
    
}

@AutoConfiguration(after = ContextInitAutoconfiguration.class)
public class OutboxStarterAutoconfiguration {
......

我都试过了

@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)

@AutoConfiguration(after = DataSourceAutoConfiguration.class)

他们都没有工作。

spring-boot spring-bean spring-boot-starter spring-autoconfiguration
1个回答
0
投票

解决方案

经过一番挖掘,我发现:

ConfigurationCondition
javadoc)。使用
ConfigurationPhase.REGISTER_BEAN
实现此接口可确保在 bean 定义准备就绪时在正确的时间评估条件。它可以按如下方式使用:

@Bean
@Conditional({
    StarterEnabled.class,
    ContextValidCondition.class
})
@ConditionalOnMissingBean(TaskScheduler.class)
public TaskScheduler threadPoolTaskScheduler(){
    ThreadPoolTaskScheduler threadPoolTaskScheduler
        = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize(5);
    threadPoolTaskScheduler.setThreadNamePrefix(
        "ThreadPoolTaskScheduler");
    return threadPoolTaskScheduler;
}

在这种情况下,

ContextValidCondition
实现了
ConfigurationCondition
并且能够准确验证上下文中某些bean的存在。

© www.soinside.com 2019 - 2024. All rights reserved.