我正在编写一个自定义 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)
他们都没有工作。
解决方案:
经过一番挖掘,我发现:
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的存在。