Spring Boot 已经实现了自动加载 DataSource 的相关配置。我们只需要在项目中引用相关依赖,在配置文件 application.yaml 中配置相关属性即可。相关相关源码入口为 org.springframework.boot.autoconfigure.jdbc 包下的 DataSourceAutoConfiguration 配置类。
(一) Spring Boot 启动会调用 DataSourceAutoConfiguration 。部分源码如下:
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration {
private static final Log logger = LogFactory
.getLog(DataSourceAutoConfiguration.class);
@Bean
@ConditionalOnMissingBean
public DataSourceInitializer dataSourceInitializer(DataSourceProperties properties,
ApplicationContext applicationContext) {
return new DataSourceInitializer(properties, applicationContext);
}
/**
* Determines if the {@code dataSource} being used by Spring was created from
* {@link EmbeddedDataSourceConfiguration}.
* @param beanFactory the bean factory
* @return true if the data source was auto-configured.
*/
public static boolean containsAutoConfiguredDataSource(
ConfigurableListableBeanFactory beanFactory) {
try {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("dataSource");
return EmbeddedDataSourceConfiguration.class.getName()
.equals(beanDefinition.getFactoryBeanName());
}
catch (NoSuchBeanDefinitionException ex) {
return false;
}
}
.......
}
但是有些公司要求,数据库的相关配置,尤其是密码,不能明文放在配置文件中,需要调用公司相关平台提供的接口来获取数据库加密后的密码进行配置,本文即是讲解如何通过自定义 DataSourceAutoConfiguration 配置数据源 DataSource
(二) 项目中常使用的 DataSource 为阿里的 druid 。相关参考 https://github.com/alibaba/druid
项目中新建配置类 DataSourceProperties,代码如下:
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Resource DataSourceProperties properties;
@Bean
public DataSource dataSource() {
//可以在此处调用相关接口获取数据库的配置信息进行 DataSource 的配置
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
dataSource.setDriverClassName(properties.getDriverClassName());
return dataSource;
}
}
写好配置类后,还有一步很关键
(三) 创建 spring.factories
在 resources 下面创建 META-INF/spring.factories , 然后在文件中把第 (二) 步的类配置进去,内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.sinosoft.configurer.database.DataSourceAutoConfiguration