使用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