Springboot自动配置原理及DataSource的应用方式

 更新时间:2024年07月11日 14:44:17   作者:蜡笔白阁下  
这篇文章主要介绍了Springboot自动配置原理及DataSource的应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

自动配置springboot

自动配置功能会扫描所有引用jar包下的 META-INF/spring.factories 文件

找到其中的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的数据

作为自动配置类,然后根据条件判断是否加载它们

自动配置与DataSource

DataSource 数据源的自动配置类是 DataSourceAutoConfiguration :

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@AutoConfigureBefore(SqlInitializationAutoConfiguration.class)
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class,
DataSourceInitializationConfiguration.InitializationSpecificCredentialsDataSourceInitializationConfiguration.class,
DataSourceInitializationConfiguration.SharedCredentialsDataSourceInitializationConfiguration.class })

public class DataSourceAutoConfiguration {}

1.其中 @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) ,表示项目中必须存在 DataSource EmbeddedDatabaseType 这两个类,而 EmbeddedDatabaseType 是在 spring-boot-starter-jdbc 依赖包中的,所以需要引入

2.连接数据库需要引入驱动包,比如:mysql-connector-java

3.@EnableConfigurationProperties(DataSourceProperties.class) 表示启用DataSourceProperties 配置类,数据库的配置信息都在这个配置类中

4.Springboot 默认数据源是HikariDataSource,原因如下:

  • 4.1DataSourceAutoConfiguration 被启用之后,内部存在一个配置类:
@Configuration(proxyBeanMethods = false)
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })

protected static class PooledDataSourceConfiguration {}

默认情况下,上面的条件都会满足,需要关注 @Import 注解,这里导入了很多配置类,这些配置类上也会有各种 @Conditional… 条件显示,默认情况下只会有 DataSourceConfiguration.Hikari.class 配置类的条件满足,如下:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",matchIfMissing = true)

static class Hikari {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    HikariDataSource dataSource(DataSourceProperties properties) {
        HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
        if (StringUtils.hasText(properties.getName())) {
            dataSource.setPoolName(properties.getName());
        }
        return dataSource;
    }
}

其中可以看到可以通过 spring.datasource.type 设置要使用的数据源类型,这里的 matchIfMissing = true 正是 HikariDataSource 成为默认数据源的关键,它表示如果spring.datasource.type 不配置的话,这个条件依然满足。

内部加载 HikariDataSource bean 的时候,可以看到标注了配置文件的前缀 spring.datasource.hikari ,其实这里的 DataSourceProperties 参数已经包含了使用前缀 spring.datasource 配置的数据库信息,而这些信息会被传递到 HikariDataSource 数据源中,而使用前缀 spring.datasource.hikari 的配置信息也会被应用到 HikariDataSource ,如果二者存在重复,spring.datasource.hikari 配置的数据会覆盖之前的配置。

总结

以上就是 springboot 配置数据源以及HikariDataSource 作为默认数据源的逻辑,并且springboot 使用了spring.datasource.type 配置,控制了只会有一个 DataSource 实例被创建装载。

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中减少if-else的几种方式

    Java中减少if-else的几种方式

    if判断语句是很多编程语言的重要组成部分,但是,若我们最终编写了大量嵌套的if语句,这将使得我们的代码更加复杂和难以维护,本文主要介绍了Java中减少if-else的几种方式,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • SpringBoot框架集成token实现登录校验功能

    SpringBoot框架集成token实现登录校验功能

    这篇文章主要为大家详细介绍了SpringBoot框架集成token实现登录校验功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • SpringBoot实现配置文件的替换

    SpringBoot实现配置文件的替换

    这篇文章主要介绍了SpringBoot实现配置文件的替换,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • dubbo扩展点AOP切面功能扩展示例详解

    dubbo扩展点AOP切面功能扩展示例详解

    这篇文章主要为大家介绍了dubbo扩展点AOP切面功能扩展示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • SSH框架网上商城项目第8战之查询和删除商品类别功能实现

    SSH框架网上商城项目第8战之查询和删除商品类别功能实现

    SSH框架网上商城项目第8战之查询和删除商品类别功能实现,为项目增加功能,添加、更新、删除和查询操作,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 使用注解开发SpringMVC详细配置教程

    使用注解开发SpringMVC详细配置教程

    这篇文章主要介绍了使用注解开发SpringMVC详细配置教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java网络通信基础编程(必看篇)

    Java网络通信基础编程(必看篇)

    下面小编就为大家带来一篇Java网络通信基础编程(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • java生成图片验证码示例代码

    java生成图片验证码示例代码

    这篇文章主要为大家详细介绍了java生成图片验证码示例代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 浅析SpringCloud Alibaba-Nacos 作为注册中心示例代码

    浅析SpringCloud Alibaba-Nacos 作为注册中心示例代码

    这篇文章主要介绍了SpringCloud Alibaba-Nacos 作为注册中心示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java实现二叉树的深度优先遍历和广度优先遍历算法示例

    Java实现二叉树的深度优先遍历和广度优先遍历算法示例

    这篇文章主要介绍了Java实现二叉树的深度优先遍历和广度优先遍历算法,结合实例形式详细分析了二叉树的定义、深度优先遍历与广度优先遍历算法原理与相关操作实现技巧,需要的朋友可以参考下
    2018-04-04

最新评论