Spring Boot(3):加载DataSource过程的源码分析及yml中DataSource的配置

Spring Boot实现了自动加载DataSource及相关配置。当然,使用时加上@EnableAutoConfiguration注解是必须的。下面就是对这一部分的源码分析。

(1)Spring Boot启动后会调用org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration。下面是部分源码。

 1 @Configuration
 2 @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
 3 @EnableConfigurationProperties(DataSourceProperties.class)
 4 @Import({ DataSourcePoolMetadataProvidersConfiguration.class,
 5         DataSourceInitializationConfiguration.class })
 6 public class DataSourceAutoConfiguration {
 7
 8     @Configuration
 9     @Conditional(EmbeddedDatabaseCondition.class)
10     @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
11     @Import(EmbeddedDataSourceConfiguration.class)
12     protected static class EmbeddedDatabaseConfiguration {
13     }
14
15     @Configuration
16     @Conditional(PooledDataSourceCondition.class)
17     @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
18     @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
19             DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,
20             DataSourceJmxConfiguration.class })
21     protected static class PooledDataSourceConfiguration {
22     }
23     ......
24 }

我们从中可以看出,DataSourceAutoConfiguration中有两个嵌套类,一个是EmbeddedDatabaseConfiguration,另一个是PooledDataSourceConfiguration。

EmbeddedDatabaseConfiguration表示已经嵌入Spring Boot的DataSource,除了Maven中加入相应的Driver,可以不做其他额外配置就能使用。从EmbeddedDatabaseType类可以看出,Spring Boot的内嵌DataSource支持HSQL,H2,DERBY这三种DB。

PooledDataSourceConfiguration表示Spring Boot还支持一些实现Pool的DataSource。从org.springframework.boot.jdbc.DataSourceBuilder中可以看出,当前版本的Spring Boot(2.0)只支持com.zaxxer.hikari.HikariDataSource,org.apache.tomcat.jdbc.pool.DataSource,org.apache.commons.dbcp2.BasicDataSource。其中,性能更加优秀的HikariDataSource是Spring Boot的默认选择(DataSourceBuilder中DATA_SOURCE_TYPE_NAMES[0]=com.zaxxer.hikari.HikariDataSource)。所以,当application.yml文件中做如下配置时,Spring Boot默认使用HikariDataSource数据库连接池。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/sas
    username: root
    password: ****
    driver-class-name: com.mysql.jdbc.Driver
    #type: com.zaxxer.hikari.HikariDataSource

(2)我们以HikariDataSource举例,接下来调用PooledDataSourceConfiguration中org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration抽象类的Hikari嵌套类(DataSourceConfiguration抽象类的一个实现类)。

 1 abstract class DataSourceConfiguration {
 2
 3     @SuppressWarnings("unchecked")
 4     protected <T> T createDataSource(DataSourceProperties properties,
 5             Class<? extends DataSource> type) {
 6         return (T) properties.initializeDataSourceBuilder().type(type).build();
 7     }
 8
 9     /* Omit Tomcat Pool DataSource configuration.*/
10     /**
11      * Hikari DataSource configuration.
12      */
13     @ConditionalOnClass(HikariDataSource.class)
14     @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)
15     static class Hikari extends DataSourceConfiguration {
16
17         @Bean
18         @ConfigurationProperties(prefix = "spring.datasource.hikari")
19         public HikariDataSource dataSource(DataSourceProperties properties) {
20             HikariDataSource dataSource = createDataSource(properties,
21                     HikariDataSource.class);
22             if (StringUtils.hasText(properties.getName())) {
23                 dataSource.setPoolName(properties.getName());
24             }
25             return dataSource;
26         }
27     }
28     /* Omit DBCP DataSource configuration.*/
29 }

我们从黄色部分可以看出,当application.yml文件中配置spring.datasource.type=com.zaxxer.hikari.HikariDataSource时,会使用HikariDataSource作为数据库连接池。它会

原文地址:https://www.cnblogs.com/storml/p/8611388.html

时间: 2024-10-26 08:50:36

Spring Boot(3):加载DataSource过程的源码分析及yml中DataSource的配置的相关文章

Android布局文件的加载过程分析:Activity.setContentView()源码分析

大家都知道在Activity的onCreate()中调用Activity.setContent()方法可以加载布局文件以设置该Activity的显示界面.本文将从setContentView()的源码谈起,分析布局文件加载所涉及到的调用链.本文所用的源码为android-19. Step 1  .Activity.setContentView(intresId) public void setContentView(int layoutResID) { getWindow().setConten

优化ListView中的网络图片加载 及 Volley库源码分析

使用适当的开源库,如Volley或者Universal ImageLoader 以Volley库为例.Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程. 主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题.如下图: 其中左下角是NetworkDispatcher线程,大致步骤是: 1.不断从请求队列中取出请求 request = mQueue.take(); 2.发起网络请求 NetworkResp

时尚设计!三种奇特的网格加载效果【附源码下载】

如果你看过三星企业设计中心网站,你肯定已经注意到了时尚的网格加载效果.每一项加载的时候,背景色会首先滑出,然后图像显现出来.滑动颜色表示图像,也就是说它是彩色图像的主色. 在这篇文章中,我们想向您展示了如何使用 Masonry 网格砌体插件,结合 CSS 动画重现这种效果.另外在这里,我们还借助了 ColorFinder 来获得的图像的最突出的颜色来作为初始的加载背景色使用. 立即下载      在线演示 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safar

Android应用程序启动过程——Launcher源码分析

当我们在Launcher界面单击一个应用程序图标时就会启动一个程序,那这一个过程究竟发生了些哪样呢?让我们跟踪Launcher源码来分析一下吧. 先上流程图: step1.追踪Launcher  从源码中我们可以发现Launcher其实也是一个程序,它继承于Activity.找到该文件中的onCreate()方法,代码片段如下: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSta

包括继承的类的初始化及类的加载一(附源码)

前言 在许多传统语言中,程序是作为启动过程的一部分立刻被加载的.然后是初始化,紧接着程序开始运行.这些语言的初始化过程必须小心控制,以确保定义为static的东西,其初始化顺序不会造成麻烦.例如C++中,如果某个static期望另一个static在被初始化之前就能有效地使用它,那么就会出现问题. Java就不会出现这个问题,因为它采用了一种不同的加载方式.加载是众多变得更加容易的动作之一,因为Java中所有的事物都是对象.请记住,每个类的编译代码都存在于它们自己的独立的文件中.该文件只在需要程序

包括继承的类的初始化及类的加载二(附源码)

前言 在许多传统语言中,程序是作为启动过程的一部分立刻被加载的.然后是初始化,紧接着程序开始运行.这些语言的初始化过程必须小心控制,以确保定义为static的东西,其初始化顺序不会造成麻烦.例如C++中,如果某个static期望另一个static在被初始化之前就能有效地使用它,那么就会出现问题. Java就不会出现这个问题,因为它采用了一种不同的加载方式.加载是众多变得更加容易的动作之一,因为Java中所有的事物都是对象.请记住,每个类的编译代码都存在于它们自己的独立的文件中.该文件只在需要程序

Spring Boot 启动加载数据 CommandLineRunner

实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现. 很简单,只需要一个类就可以,无需其他配置. 创建实现接口 CommandLineRunner 的类 Spring Boot应用程序在启动后,会遍历CommandLineRunner接口的实例并运行它们的run方法.也可以利用@Order注解(或者实现Order接口)来规定所有CommandL

spring boot environment加载过程分析

environment是在printBanner之前就初始化好了, 更在context创建之前, 已经加载application-xxxx.properties, System.properties, System.environment ... 也可以自己监听应用启动 SpringApplicationRunListener事件, 完成自己的独特的配置加载方案 启动后调用listener.finished() 打印一些启动后的信息 prepareEnvironment()源码如下 1 priv

图片懒加载库echo.js源码学习

最近不是在学习设计模式吗,然后就看到了代理模式加载图片的样例,然后自己实现了一下,就发现,自己写的这货每次就只能加载一张图片,而且图片要放在哪也是个很严重的问题 然后就去了 gayhub 找了找了找流行的图片懒加载库,这一找,就找到了一个echo.j是,打开一看,源码只有100多行吧,震惊..,看完源码,哎,木有上代理模式呀 仔细学习了下源码:觉得这种做法比较适合图片位置确定场景的吧,比如文章啊,一篇文章老长了,里面有蛮多图片散落在不同的地方,这样就比较合适,有可能有很多图片读者都不会翻到哪里,