Spring boot裏datasource的配置

spring boot裏,在包spring-boot-autoconfigure裏有個datasource自動配置類

寫道
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

 在配置文件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.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8
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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章