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 实例被创建装载。

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

相关文章

  • 2023最新版本idea用maven新建web项目(亲测不报错)

    2023最新版本idea用maven新建web项目(亲测不报错)

    这篇文章主要给大家介绍了关于2023最新版本idea用maven新建web项目,Maven是当今Java开发中主流的依赖管理工具,文中介绍的步骤亲测不报错,需要的朋友可以参考下
    2023-07-07
  • Spring bean配置单例或多例模式方式

    Spring bean配置单例或多例模式方式

    这篇文章主要介绍了Spring bean配置单例或多例模式方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • JPA设置默认字段及其长度详解

    JPA设置默认字段及其长度详解

    JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。本文主要介绍了JPA如何设置默认字段及其长度,感兴趣的同学可以了解一下
    2021-12-12
  • java实现随机森林RandomForest的示例代码

    java实现随机森林RandomForest的示例代码

    本篇文章主要介绍了java实现随机森林RandomForest的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 解读@Data注解父子类继承的问题

    解读@Data注解父子类继承的问题

    在Java开发中,使用Lombok库的@Data注解简化了代码,但在父子类继承关系中使用@Data注解时会遇到问题,主要问题是:当父类和子类都使用@Data注解时,会导致equals方法不对称,解决方案是在子类中使用@EqualsAndHashCode注解
    2024-11-11
  • 带你重新认识Java动态代理

    带你重新认识Java动态代理

    这篇文章主要为大家介绍了Java的动态代理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Java动态显示当前日期和时间

    Java动态显示当前日期和时间

    这篇文章主要为大家详细介绍了Java动态显示当前日期和时间,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • MyBatis-Plus Page 分页不生效的问题解决

    MyBatis-Plus Page 分页不生效的问题解决

    分页是常见的一种功能,本文主要介绍了MyBatis-Plus Page分页不生效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • java中实现一个定时任务的方式

    java中实现一个定时任务的方式

    本文介绍了三种在Java中实现定时任务的方法,并推荐使用Spring Boot注解方式,介绍了如何使用`@Scheduled`注解结合Cron表达式来设置定时任务,并提供了一个示例配置文件
    2025-03-03
  • SpringMVC post请求中文乱码问题解决

    SpringMVC post请求中文乱码问题解决

    这篇文章主要介绍了SpringMVC post请求中文乱码问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论