SpringBoot数据源——为什么平时默认线程池是Hikari

本文主要对DataSourceAutoConfiguration类进行讲解,然后对这个类的注解做一个解释,所以直接打开这个类,开始看……

ps:我用的版本是2.3.0.RELEASE

目录

DataSourceAutoConfiguration类注解

@Configuration(proxyBeanMethods = false)

@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })

@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")

@EnableConfigurationProperties(DataSourceProperties.class)

@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })

DataSourcePoolMetadataProvidersConfiguration

DataSourceInitializationConfiguration

内部类EmbeddedDatabaseConfiguration注解

@Conditional(EmbeddedDatabaseCondition.class)

内部类PooledDataSourceConfiguration注解

@Conditional(PooledDataSourceCondition.class)

总结


DataSourceAutoConfiguration类注解

@Configuration(proxyBeanMethods = false)

@Configuration这个注解比较常用,就不说了,主要是proxyBeanMethods = false。表示禁用代理模式,此时 Spring 不会为 @Configuration 注解所标注的类生成代理对象,而是直接调用其中的方法。

在实际开发中,如果一个类中的方法都是独立的、无状态的 Bean 配置方法(即通过 @Bean 注解定义的方法),则可以将 @Configuration(proxyBeanMethods = false) 应用于该类以提高性能。因为禁用代理模式可以避免 Spring 为每个 Bean 配置方法创建代理对象,从而减少 Spring 容器初始化和运行时的开销。但需要注意的是,禁用代理模式可能会导致部分功能失效,比如声明的 Bean 不能被切面增强等。

@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })

表示只有当 DataSourceEmbeddedDatabaseType 这两个类在当前应用的类路径上存在时,被该注解所标注的 Bean 或配置类才会被创建和注册。其中 DataSource 是 Java 标准库中的数据库连接池接口,而 EmbeddedDatabaseType 则是 Spring Boot 提供的用于支持嵌入式数据库的枚举类。

@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")

表示只有当容器中不存在 io.r2dbc.spi.ConnectionFactory 类型的 Bean 时,被该注解所标注的 Bean 或配置类才会被创建和注册。其中 io.r2dbc.spi.ConnectionFactory 是 R2DBC 数据库连接抽象接口。

@EnableConfigurationProperties(DataSourceProperties.class)

表示开启 DataSourceProperties 配置属性类的自动注入。Spring Boot 会自动根据字段或 setter 方法的名称来匹配 DataSourceProperties 中的属性,在容器启动时将配置文件中的属性值自动注入到 DataSourceProperties 类对象中。

通常情况下,在使用 Spring Boot 开发应用时,我们会使用 @ConfigurationProperties 注解来定义应用需要的配置项。通过定义一个与配置文件对应的配置属性类,并使用 @EnableConfigurationProperties 进行开启自动注入,我们可以将配置文件中的属性值自动注入到配置属性类中,然后在应用中使用该配置属性类对象,从而方便地获取和管理应用的配置信息。

@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })

@Import 注解中,传入一个包含多个配置类的数组,表示将这些配置类中定义的 Bean 或组件导入到当前的配置类中,以便在容器启动时一起注册到 Spring 容器中。

具体来说,在使用 Spring Boot 开发应用时,我们可能需要使用到其他模块或第三方库中的 Bean 或组件,此时可以通过 @Import 注解将相关的配置类或组件导入到当前应用的配置类中。

DataSourcePoolMetadataProvidersConfiguration

为支持的数据源提供一个 DataSourcePoolMetadataProvider实例,用来提供数据源连接池元数据信息的,包括连接池名称、最大连接数、空闲连接数等。

DataSourceInitializationConfiguration

初始化数据源的,包括执行 SQL 脚本、设置数据源编码等。

内部类EmbeddedDatabaseConfiguration注解

@Configuration(proxyBeanMethods = false)不再赘述。

@Conditional(EmbeddedDatabaseCondition.class)

如果符合EmbeddedDatabaseCondition的条件,才能继续往下读取注解

判断条件是getMatchOutcome的代码

可以看出如果spring.datasource.url设置则不符合条件

如果满足pooledCondition则不符合条件(直接看PooledDataSourceCondition,下边再讲)

如果没有EmbeddedDatabase则不符合条件,其余符合

所以以上情况下嵌入式数据源是不会使用到的

下边注解不再赘述

内部类PooledDataSourceConfiguration注解

@Configuration(proxyBeanMethods = false)不再赘述

@Conditional(PooledDataSourceCondition.class)

这个条件类继承了AnyNestedCondition这个类表示任一条件符合就生效

指定spring.datasource.type则生效

"com.zaxxer.hikari.HikariDataSource",
"org.apache.tomcat.jdbc.pool.DataSource", 
"org.apache.commons.dbcp2.BasicDataSource"

以上三个数据源有一个可用则生效,内置的有HikariDataSource所以生效@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })不再赘述

最后一个Import注解第一个导入的就是DataSourceConfiguration.Hikari,所以生效的就是Hikari它,并且这些类的注解上都有一个@ConditionalOnMissingBean(DataSource.class)。

总结

数据源开胃菜,复习注解

你可能感兴趣的:(spring,spring,boot,后端)