Spring Boot データソース構成の原則

データベースアクセスのプロセスにおいて、「データソース」は間違いなく最も重要な概念の 1 つであり、データベースアクセスに関連するさまざまなパラメーターをカプセル化して管理できるだけでなく、データベース接続プールを管理し、データベース接続パフォーマンスを向上させることもできます。

現在、DBCP、C3P0、Druid、HikariCP など、優れたオープン ソース データ ソースが数多く市場に出回っています。Spring Boot 2.x では、現在最高のパフォーマンスを発揮する HikariCP がデフォルトのデータ ソースとして使用されます。次に、Spring Boot のデフォルトのデータ ソース構成とその原則を紹介しましょう。
Spring Boot のほとんどすべてのデフォルト
構成は、構成クラス XxxAutoConfiguration を介して構成されており、Spring Boot データ ソースも例外ではなく、その自動構成クラスは DataSourceAutoConfiguration です。


DataSourceAutoConfigurationには、次の 5 つの内部静的クラスが含まれて

ます

このうち、PooledDataSourceConfiguration と EmbeddedDatabaseConfiguration は @Configuration アノテーションが付けられた自動構成クラスで、残りの 3 つは制限クラスです。
EmbeddedDatabaseConfiguration EmbeddedDatabaseConfiguration は
、名前が示すように、埋め込みデータ ソースの自動構成クラスです. このクラスにはメソッドはありません. その主な機能は、 @Import アノテーションを介して EmbeddedDataSourceConfiguration クラスを導入することによって実装されます.
@Import({EmbeddedDataSourceConfiguration.class})

EmbeddedDataSourceConfiguration は、HSQL、H2、および DERBY データベースをサポートする Spring Boot 組み込みデータ ソースをコンテナーに追加します。そのコードの一部は次のとおりです。
@Configuration(
proxyBeanMethods = false
)
@EnableConfigurationProperties({DataSourceProperties.class})
public class EmbeddedDataSourceConfiguration implements BeanClassLoaderAware { private ClassLoader classLoader; public EmbeddedDataSourceConfiguration() { } public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } //向コンテナー@Bean( destroyMethod = "shutdown" ) public EmbeddedDatabase dataSource(DataSourceProperties properties) {











return (new EmbeddedDatabaseBuilder()).setType(EmbeddedDatabaseConnection.get(this.classLoader).getType()).setName(properties.determineDatabaseName()).build();
}
}

上記の分析を通じて、自動構成クラス EmbeddedDatabaseConfiguration の機能は、埋め込みデータ ソース (DataSource) をコンテナーに追加することであることがわかりますが、これは条件付きです。

また、DataSourceAutoConfigurationの内部制限クラスEmbeddedDatabaseConditionを条件判定に使用するEmbeddedDatabaseConfigurationクラスにも@Conditionalアノテーションを使用する。
@Conditional({DataSourceAutoConfiguration.EmbeddedDatabaseCondition.class})

EmbeddedDatabaseCondition は主に、プールされたデータ ソース (PooledDataSource) がコンテナー内に既に存在するかどうかを検出するために使用されます。コンテナーにプールされたデータ ソースがある場合、EmbeddedDatabaseConfiguration をインスタンス化できません。EmbeddedDatabaseConfiguration は、コンテナーにプールされたデータ ソースがない場合にのみインスタンス化でき、埋め込みデータ ソース (EmbeddedDataSource) をコンテナーに追加できます。
PooledDataSourceConfiguration
PooledDataSourceConfiguration は、プールされたデータ ソースの自動構成クラスであり、このクラスには @Conditional アノテーションが使用され、DataSourceAutoConfiguration の内部制限クラス PooledDataSourceCondition を条件判断に使用します。
@Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})

PooledDataSourceCondition は、EmbeddedDatabaseCondition と同様に、プールされたデータ ソースがコンテナーに既に存在するかどうかを検出するためにも使用されますが、違いは、プールされたデータ ソースがコンテナーにプールされたデータ ソースがある場合にのみ、PooledDataSourceConfiguration をインスタンス化してコンテナーに追加できることです。

EmbeddedDatabaseConfiguration と同様に、PooledDataSourceConfiguration クラスにはメソッドの実装はなく、そのすべての機能は @Import アノテーションを介して他のクラスを導入することによって実装されます。
@Import({Hikari.class, Tomcat.class, Dbcp2.class, OracleUcp.class, Generic.class, DataSourceJmxConfiguration.class})

PooledDataSourceConfiguration は、@Import アノテーションを使用して、Hikari、Tomcat、Dbcp2、OracleUcp、および汎用の 5 つのデータ ソース構成クラスを導入します. これらはすべて DataSourceConfiguration の内部クラスであり、それらの機能は類似しており、指定されたデータ ソースをコンテナーに追加します.

ひかりを例に解析してみましょう、ひかりのソースコードは以下の通りです。
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({HikariDataSource.class})
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"},
havingValue = "com.zaxxer.hikari.HikariDataSource ",
matchIfMissing = true
)
static class Hikari { Hikari() { } @Bean @ConfigurationProperties( prefix = "spring.datasource.hikari" ) HikariDataSource dataSource(DataSourceProperties properties) {







HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
if (StringUtils.hasText(properties.getName())) { dataSource.setPoolName(properties.getName()); }データソースを返します。} }




Hikari クラスでは主に以下のアノテーションが使用されます:
@Configuration: 現在のクラスが構成クラスであることを示します.
@ConditionalOnMissingBean({DataSource.class}): ユーザーが存在しない場合にのみ構成クラスがインスタンス化されることを示します.コンテナに定義されたデータ ソース ;
@ConditionalOnClass({HikariDataSource.class}) : HikariDataSource クラスがクラス パスに存在する場合にのみ Hikari がインスタンス化されることを示します。HikariDataSource クラスはデフォルトで spring-boot-starter-jdbc によって導入されるため、pom.xml でスターターを導入する限り、Hikari はインスタンス化されます (これは、Spring Boot 2.x による HikariCP のデフォルトの使用方法でもあります)。情報元)。;
@ConditionalOnProperty(name = {"spring.datasource.type"}, havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true): spring.datasource.type = com が Spring Boot 構成ファイルで構成されていることを示しますHikari は、.zaxxer.hikari.HikariDataSource (明示的に Hikari データ ソースの使用を指定) の場合、または spring.datasource.type が構成されていない (つまり、デフォルト) 場合にのみインスタンス化されます。

Hikari クラスは、@Bean アノテーションを介してコンテナに HikariDataSource コンポーネントを追加し、DataSourceConfiguration の createDataSource() メソッドを呼び出してコンポーネントのインスタンス オブジェクトを取得します。コードは次のとおりです。
@Bean
@ConfigurationProperties(
prefix = "spring.datasource.hikari"
)
HikariDataSource dataSource(DataSourceProperties properties) { HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class); if (StringUtils.hasText(Name) )) { dataSource.setPoolName(properties.getName()); } return dataSource; }





createDataSource() メソッドで、DataSourceProperties の initializeDataSourceBuilder() を呼び出して DataSourceBuilder を初期化します。ソース コードは次のとおりです。
protected static T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) { return properties.initializeDataSourceBuilder().type(type).build() ;

initializeDataSourceBuilder() メソッドは、DataSourceBuilder の create() メソッドを呼び出して DataSourceBuilder オブジェクトを作成し、Spring Boot 構成ファイル ( application.properties/yml) およびその他の情報。
public DataSourceBuilder<?> initializeDataSourceBuilder() { return DataSourceBuilder.create(this.getClassLoader()).type(this.getType()). driverClassName(this.determineDriverClassName()).url(this.determineUrl()).username( this.determineUsername()).password(this.determinePassword()); }


上記のように、spring.datasource.type はデフォルトで構成なしで構成できるため、createDataSource() メソッドが返された DataSourceBuilder オブジェクトを取得した後、その type 属性を HikariDataSource に再度設定し、DataSourceBuilder メソッドの build() を呼び出す必要があります。 HikariDataSource の初期化を完了します。

ここに画像の説明を挿入

図 1: HikariDataSource の初期化

dataSource() メソッドは、データ ソース オブジェクトを取得し、接続プールの名前 (name) を設定して、コンテナに注入します。

図 2: 接続プール名の設定

ここに画像の説明を挿入

それ以来、Spring Boot データソース自動構成の原理の分析を完了しました。

まとめ
Spring Boot データソース自動構成の原理を分析すると、
ユーザーがデータ ソースを構成しなくても、コンテナに HikariDataSource クラスがあれば、Spring Boot は Hikari を自動的にインスタンス化し、それを情報元。
Spring Boot の JDBC シーン スターター (spring-boot-starter-data-jdbc) は、デフォルトで spring-boot-starter-jdbc を介して HikariCP データ ソース (HikariDataSource クラスを含む) を導入するため、Spring Boot はデフォルトで HikariCP をデータ ソースとして使用します。

おすすめ

転載: blog.csdn.net/weixin_64842782/article/details/125106982