Spring Boot 简化了数据源的配置。
默认情况下,Spring Boot 将使用前缀为 spring.datasource.* 的配置属性实例化其默认 DataSource:
spring.datasource.jdbcUrl = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
我们现在想继续使用相同的方式来配置第二个 DataSource,但使用不同的属性命名空间:
spring.second-datasource.jdbcUrl = [url]
spring.second-datasource.username = [username]
spring.second-datasource.password = [password]
因为我们希望 Spring Boot 自动配置能够获取这些不同的属性(并实际实例化两个不同的数据源),所以我们将定义 2 个类似于前面部分中的配置类:
@Configuration
@PropertySource({"classpath:persistence-multiple-db-boot.properties"})
@EnableJpaRepositories(
basePackages = "com.myProj.multipledb.dao.user",
entityManagerFactoryRef = "userEntityManager",
transactionManagerRef = "userTransactionManager")
public class PersistenceUserAutoConfiguration {
@Primary
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource userDataSource() {
return DataSourceBuilder.create().build();
}
// userEntityManager bean
// userTransactionManager bean
}
然后这个
@Configuration
@PropertySource({"classpath:persistence-multiple-db-boot.properties"})
@EnableJpaRepositories(
basePackages = "com.myProj.multipledb.dao.product",
entityManagerFactoryRef = "productEntityManager",
transactionManagerRef = "productTransactionManager")
public class PersistenceProductAutoConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.second-datasource")
public DataSource productDataSource() {
return DataSourceBuilder.create().build();
}
// productEntityManager bean
// productTransactionManager bean
}
我们已经根据 Boot 自动配置约定在 persistence-multiple-db-boot.properties 中定义了数据源属性。
有趣的部分是使用@ConfigurationProperties 注释数据源bean 创建方法。我们只需要指定相应的配置前缀。在这个方法中,我们使用了一个 DataSourceBuilder,Spring Boot 会自动处理剩下的事情。
但是配置的属性是如何真正注入到 DataSource 配置中的呢?
当调用 DataSourceBuilder 上的 build() 方法时,它会调用其私有的 bind() 方法:
public T build() {
Class<? extends DataSource> type = getType();
DataSource result = BeanUtils.instantiateClass(type);
maybeGetDriverClassName();
bind(result);
return (T) result;
}
这个私有方法执行大部分自动配置魔法,将解析的配置绑定到实际的 DataSource 实例:
private void bind(DataSource result) {
ConfigurationPropertySource source = new MapConfigurationPropertySource(this.properties);
ConfigurationPropertyNameAliases aliases = new ConfigurationPropertyNameAliases();
aliases.addAliases("url", "jdbc-url");
aliases.addAliases("username", "user");
Binder binder = new Binder(source.withAliases(aliases));
binder.bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(result));
虽然我们自己不必接触任何这些代码,但了解 Spring Boot 自动配置背后发生的事情仍然很有用。
除此之外,事务管理器和实体管理器 bean 配置与标准 Spring 应用程序相同。
请参考以下链接以获取示例:
https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring-data-6430b00c02e7