Spring Boot 使用@ConditionOnBean(DataSource.class)的Sping Boot 自动配置未按预期工作

b91juud3  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(204)

我正在尝试为数据库的Togglz状态存储库的使用做一个非常简单的自动配置。当有数据源bean可用时,我希望有一个JDBCStateRepository,当运行排除数据库的测试或类似的任何情况时,我希望保留默认的一个。
这是一个非常简单的 Boot 应用程序,它带有一个数据库连接和togglz库。

@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class TogglzStateRepositoryAutoConfiguration {
    
    @Bean
    @ConditionalOnBean(DataSource.class)
    public StateRepository getStateRepository(DataSource dataSource) {
        return new JDBCStateRepository(dataSource);
    }
}

问题是这个bean从来没有使用这个配置创建过,它从来没有找到数据源:

TogglzStateRepositoryAutoConfiguration#getStateRepository:
      Did not match:
         - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) did not find any beans of type javax.sql.DataSource (OnBeanCondition)

当报告中的上面几行:

DataSourceHealthContributorAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'org.springframework.jdbc.core.JdbcTemplate', 'org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource' (OnClassCondition)
      - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition)
      - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found bean 'dataSource' (OnBeanCondition)

这与我放置的配置顺序无关(@DependsOn、@AutoConfigureAfter、Before等)。
有没有想法我可以做些什么或测试有这个工作如预期,或解释我错过了什么?
谢谢大家!

ldfqzlk8

ldfqzlk81#

好的,我找到了答案,Spring管理@Configuration和AutoConfiguration的方式不同(即使它们共享相同的注解)。
不同之处在于,您必须从spring.factories文件中声明一个AutoConfiguration,如下所示:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
xxx.xxx.xxx.TogglzStateRepositoryAutoConfiguration

然后,它将以不同的方式处理其中的bean声明,以考虑正确的注解和注入顺序。
希望能有所帮助!

相关问题