2016-11-24 562 views
0

我有多个春天开机起动器,每个这样定义一个数据源:排除启动库中的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正在拦截该方法,然后执行自己的内部注入。这一次,它注入了一种数据源。

当一个应用程序使用其中一个启动器时,它的工作原理没有问题。然而,当使用多个首先,我得到的错误是这样的:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: someUniqueNamespaceDataSource,someOtherUniqueNamespaceDataSource 

我相信这是因为春季启动在内部被注入型,即使我的代码注入合格的豆。

有什么方法可以让初学者库指出DataSources不应该被认为是自动配置的候选对象?

是否有某种方式取决于多个这些入门库的应用程序可以将它们从自动配置中排除?

完全禁用自动配置实际上并不可行。此外,手动排除触发存在DataSource bean的所有当前自动配置太脆弱,因为稍后添加依赖关系,特别是基于DataSource bean触发的传递依赖关系,将重新引入错误。

+1

但你怎么自动装配数据源? – Strelok

回答

0

在你@SpringBootApplication@EnableAutoConfiguration注释设置exclude属性:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, 
    HibernateJpaAutoConfiguration.class, 
    DataSourceTransactionManagerAutoConfiguration.class }) 

这应该做的伎俩。

+0

感谢您的回答。这是我目前不得不采取的方法。但是,我认为这太脆弱了。 例如,我还没有使用JPA/Hibernate,因此排除HibernateJpaAutoConfiguration既不必要也看起来很奇怪。但是,如果我将来使用它或任何其他以DataSource为条件的初始程序,那么错误将再次出现。 –