理解数据源自动配置

  数据源核心依赖就是spring‐boot‐starter‐jdbc

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

  或者使用的是JPA:

  <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>

  Mysql数据库连接信息:

spring:
  datasource:
     url: jdbc:mysql://127.0.0.1:3306/world?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
     driverClassName: com.mysql.cj.jdbc.Driver
     username: admin
     password: admin

  查明当前数据源

@RunWith(SpringRunner.class)
@SpringBootTest
public class BootMybatisApplicationTests {

    @Autowired
    private DataSource dataSource;
    @Test
    public void contextLoads() {
        System.out.println(dataSource.getClass());
    }
}

  输出: class org.apache.tomcat.jdbc.pool.DataSource

  默认是用org.apache.tomcat.jdbc.pool.DataSource作为数据源

  数据源的相关配置都在DataSourceProperties里面:

2.自动配置原理

  org.springframework.boot.autoconfigure.jdbc包下的DataSourceConfiguration

  /**
     * Tomcat Pool DataSource configuration.
     */
    @ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
    @ConditionalOnMissingBean(DataSource.class)
    @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)
    static class Tomcat {

        @Bean
        @ConfigurationProperties(prefix = "spring.datasource.tomcat")
        public org.apache.tomcat.jdbc.pool.DataSource dataSource(
                DataSourceProperties properties) {
            org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(
                    properties, org.apache.tomcat.jdbc.pool.DataSource.class);
            DatabaseDriver databaseDriver = DatabaseDriver
                    .fromJdbcUrl(properties.determineUrl());
            String validationQuery = databaseDriver.getValidationQuery();
            if (validationQuery != null) {
                dataSource.setTestOnBorrow(true);
                dataSource.setValidationQuery(validationQuery);
            }
            return dataSource;
        }

    }

  如果在classpath下存在org.apache.tomcat.jdbc.pool.DataSource.class类,并且在配置文件中指定spring.datasource.type的值为org.apache.tomcat.jdbc.pool.DataSource,或者不写都会认为可以通过。只有通过才会进入这段配置代码,才能注入DataSourceBean。

  SpringBoot默认可以支持;

  org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource
 
posted on 2019-04-14 22:18  溪水静幽  阅读(281)  评论(0)    收藏  举报