spring boot裏,在包spring-boot-autoconfigure裏有個datasource自動配置類
在配置文件application.properties裏,配置了spring.datasource.*後,將自動配置datasource
@Conditional(DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
protected static class NonEmbeddedConfiguration {
@Autowired
private DataSourceProperties properties;
@Bean
@ConfigurationProperties(prefix = DataSourceProperties.PREFIX)
public DataSource dataSource() {
DataSourceBuilder factory = DataSourceBuilder
.create(this.properties.getClassLoader())
.driverClassName(this.properties.getDriverClassName())
.url(this.properties.getUrl()).username(this.properties.getUsername())
.password(this.properties.getPassword());
if (this.properties.getType() != null) {
factory.type(this.properties.getType());
}
return factory.build();
}
}
但這裏有個條件
@Conditional(DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition.class)
意思是說,只有存在非嵌入DataSource時纔會配置,判定的條件其實是寫在DataSourceBuilder裏的
private static final String[] DATA_SOURCE_TYPE_NAMES = new String[] {
"org.apache.tomcat.jdbc.pool.DataSource",
"com.zaxxer.hikari.HikariDataSource",
"org.apache.commons.dbcp.BasicDataSource",
"org.apache.commons.dbcp2.BasicDataSource" };
也就是說,系統裏必須存在上面列舉的這些類纔可以。
所以如果你在application.properties裏配置了spring.datasource.*有關信息後,發現沒有datasource的bean,那就說明你可以忘記添加上面這些包了。
雖然spring boot爲我們做了很多事情,但是看起來都是偷偷摸摸的,如果對於內部的實現不瞭解,就可能遇到有時有效,有時無效的情況。
爲了安心,也可以自己指定這些配置。
@Configuration
public class DbConfiguration implements TransactionManagementConfigurer {
@Autowired
private DataSourceProperties properties;
@Bean
public DataSource dataSource() {
DataSourceBuilder factory = DataSourceBuilder
.create(this.properties.getClassLoader())
.driverClassName(this.properties.getDriverClassName())
.url(this.properties.getUrl()).username(this.properties.getUsername())
.password(this.properties.getPassword());
if (this.properties.getType() != null) {
factory.type(this.properties.getType());
}
return factory.build();
}
@Bean
public PlatformTransactionManager txManager() {
return new DataSourceTransactionManager(dataSource());
}
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return txManager();
}
}
這兒實現了interface:TransactionManagementConfigurer,當有多個事務管理器時,這兒指定默認的用註解聲明的事務管理器,比如用Transactional,並未指定transactionManager時。
application.properties
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
當然,你可以不使用DataSourceBuilder,而是直接創建DataSource。