2016-11-24 564 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爲條件的初始程序,那麼錯誤將再次出現。 –