使用Spring Boot時,默認狀況下,配置DataSource
很是容易。Spring Boot會自動爲咱們配置好一個DataSource
。git
若是在application.yml
中指定了spring.datasource
的相關配置,Spring Boot就會使用該配置建立一個DataSource
。若是在application.yml
中沒有指定任何spring.datasource
的相關配置,Spring Boot會在classpath中搜索H二、hsqldb等內存數據庫的jar包,若是找到了,就會自動配置一個內存數據庫的DataSource
,因此,咱們只要引入jar包便可。例如,配置一個hsqldb數據源:github
<dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope> </dependency>
可是,在某些狀況下,若是咱們須要配置多個數據源,應該如何在Spring Boot中配置呢?spring
咱們以JDBC爲例,演示如何在Spring Boot中配置兩個DataSource
。對應的,咱們會建立兩個JdbcTemplate
的Bean,分別使用這兩個數據源。sql
首先,咱們必須在application.yml
中聲明兩個數據源的配置,一個使用spring.datasource
,另外一個使用spring.second-datasource
:數據庫
spring: application: name: data-multidatasource datasource: driver-class-name: org.hsqldb.jdbc.JDBCDriver url: jdbc:hsqldb:mem:db1 username: sa password: second-datasource: driver-class-name: org.hsqldb.jdbc.JDBCDriver url: jdbc:hsqldb:mem:db2 username: sa password:
這兩個DataSource
都使用hsqldb,可是數據庫是不一樣的。此外,在使用多數據源的時候,全部必要配置都不能省略。app
其次,咱們須要本身建立兩個DataSource
的Bean,其中一個標記爲@Primary
,另外一個命名爲secondDatasource
:ui
@Configuration public class SomeConfiguration { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondDatasource") @ConfigurationProperties(prefix = "spring.second-datasource") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } }
對於每個DataSource
,咱們都必須經過@ConfigurationProperties(prefix = "xxx")
指定配置項的前綴。url
緊接着,咱們建立兩個JdbcTemplate
的Bean,其中一個標記爲@Primary
,另外一個命名爲secondJdbcTemplate
,分別使用對應的DataSource
:spa
@Bean @Primary public JdbcTemplate primaryJdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondJdbcTemplate") public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDatasource") DataSource dataSource) { return new JdbcTemplate(dataSource); }
注意到secondJdbcTemplate
在建立時,傳入的DataSource
必須用@Qualifier("secondDatasource")
聲明,這樣,才能使用第二個DataSource
。.net
如今,咱們就建立了兩個JdbcTemplate
的Bean
。在須要使用第一個JdbcTemplate
的地方,咱們直接注入:
@Component public class SomeService { @Autowired JdbcTemplate jdbcTemplate; }
在須要使用第二個JdbcTemplate
的地方,咱們注入時須要用@Qualifier("secondJdbcTemplate")
標識:
@Component public class AnotherService { @Autowired @Qualifier("secondJdbcTemplate") JdbcTemplate secondJdbcTemplate; }
這樣,咱們就能夠針對不一樣的數據源,用不一樣的JdbcTemplate
進行操做。
當存在多個相同類型的Bean,例如,多個DataSource
,多個JdbcTemplate
時,強烈建議老是使用@Primary
把其中某一個Bean標識爲「主要的」,使用@Autowired
注入時會首先使用被標記爲@Primary
的Bean。
相同類型的其餘Bean,每個都須要用@Bean(name="xxx")
標識名字,而且,在使用@Autowired
注入時配合@Qualifier("xxx")
指定注入的Bean的名字。
完整的示例工程源碼請參考:
https://github.com/michaelliao/springcloud/tree/master/data-multidatasource