我有多个Spring Boot Starters,每个都定义一个像这样的DataSource:
@Bean
@ConfigurationProperties(prefix = "some.unique.namespace.datasource")
public DataSource someUniqueNamespaceDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SomeOtherBean someOtherBean() {
return new SomeOtherBean(someUniqueNamespaceDataSource())
}
如您所见,bean方法someUniqueNamespaceDataSource()
正在另一个bean方法中直接调用,在同一个配置类中。但是,Spring Boot正在拦截该方法,然后执行自己的内部注入。这次,它注入了一种DataSource。
当应用程序使用其中一个启动器时,它可以正常工作。但是,当它使用多个启动器时,我会收到如下错误:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: someUniqueNamespaceDataSource,someOtherUniqueNamespaceDataSource
我相信这是因为Spring Boot是按类型内部注入的,即使我的代码注入了一个合格的bean。
启动程序库是否有某种方式可以指示DataSources不应被视为自动配置的候选者?
根据多个这些入门库的应用程序是否可以通过某种方式将它们排除在自动配置之外?
完全禁用自动配置并不可行。此外,手动排除触发存在DataSource bean的所有当前自动配置太脆弱了,因为稍后添加依赖项,尤其是基于DataSource bean触发的传递依赖项,将重新引入错误。
答案 0 :(得分:0)
在@SpringBootApplication
或@EnableAutoConfiguration
注释中将exclude
属性设置为:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class })
这应该可以解决问题。