我正在尝试为数据库的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等)。
有没有想法我可以做些什么或测试有这个工作如预期,或解释我错过了什么?
谢谢大家!
1条答案
按热度按时间ldfqzlk81#
好的,我找到了答案,Spring管理@Configuration和AutoConfiguration的方式不同(即使它们共享相同的注解)。
不同之处在于,您必须从spring.factories文件中声明一个AutoConfiguration,如下所示:
然后,它将以不同的方式处理其中的bean声明,以考虑正确的注解和注入顺序。
希望能有所帮助!