標籤:password bsp primary 記憶體 str 一個 url span jdb
[From] https://www.liaoxuefeng.com/article/001484212576147b1f07dc0ab9147a1a97662a0bd270c20000
Spring Boot配置多個DataSource
廖雪峰 / 編程 / 1-13 10:11 / 閱讀: 14041
使用Spring Boot時,預設情況下,配置DataSource
非常容易。Spring Boot會自動為我們配置好一個DataSource
。
如果在application.yml
中指定了spring.datasource
的相關配置,Spring Boot就會使用該配置建立一個DataSource
。如果在application.yml
中沒有指定任何spring.datasource
的相關配置,Spring Boot會在classpath中搜尋H2、hsqldb等記憶體資料庫的jar包,如果找到了,就會自動設定一個記憶體資料庫的DataSource
,所以,我們只要引入jar包即可。例如,配置一個hsqldb資料來源:
<dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope></dependency>
但是,在某些情況下,如果我們需要配置多個資料來源,應該如何在Spring Boot中配置呢?
我們以JDBC為例,示範如何在Spring Boot中配置兩個DataSource
。對應的,我們會建立兩個JdbcTemplate
的Bean,分別使用這兩個資料來源。
首先,我們必須在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,但是資料庫是不同的。此外,在使用多資料來源的時候,所有必要配置都不能省略。
其次,我們需要自己建立兩個DataSource
的Bean,其中一個標記為@Primary
,另一個命名為secondDatasource
:
@Configurationpublic 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")
指定配置項的首碼。
緊接著,我們建立兩個JdbcTemplate
的Bean,其中一個標記為@Primary
,另一個命名為secondJdbcTemplate
,分別使用對應的DataSource
:
@Bean@Primarypublic 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
。
現在,我們就建立了兩個JdbcTemplate
的Bean
。在需要使用第一個JdbcTemplate
的地方,我們直接注入:
@Componentpublic class SomeService { @Autowired JdbcTemplate jdbcTemplate;}
在需要使用第二個JdbcTemplate
的地方,我們注入時需要用@Qualifier("secondJdbcTemplate")
標識:
@Componentpublic 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
[轉] Spring Boot配置多個DataSource