Принцип настройки источника данных Spring Boot

В процессе доступа к базе данных "источник данных", несомненно, является одним из наиболее важных понятий. Он может не только инкапсулировать и управлять различными параметрами, связанными с доступом к базе данных, но также управлять пулами соединений с базой данных и улучшать производительность соединения с базой данных.

В настоящее время на рынке существует множество отличных источников данных с открытым исходным кодом, таких как DBCP, C3P0, Druid, HikariCP и так далее. В Spring Boot 2.x в качестве источника данных по умолчанию используется наиболее производительный на данный момент HikariCP. Далее давайте представим конфигурацию источника данных Spring Boot по умолчанию и ее принципы.
DataSourceAutoConfiguration
Мы знаем, что почти все конфигурации по умолчанию в Spring Boot настраиваются через класс конфигурации XxxAutoConfiguration, и источники данных Spring Boot не являются исключением.Его класс автоматической конфигурации: DataSourceAutoConfiguration.

DataSourceAutoConfiguration включает следующие пять внутренних статических классов:
EmbeddedDatabaseCondition
PooledDataSourceAvailableCondition
PooledDataSourceCondition
PooledDataSourceConfiguration (класс автоматической настройки объединенного источника данных)
EmbeddedDatabaseConfiguration (класс автоматической настройки встроенного источника данных)

Среди них PooledDataSourceConfiguration и EmbeddedDatabaseConfiguration — это классы автоматической конфигурации, аннотированные @Configuration, а остальные три — классы ограничений.
EmbeddedDatabaseConfiguration
Как следует из названия, EmbeddedDatabaseConfiguration — это класс автоматической настройки встроенных источников данных, в этом классе нет методов, его основные функции реализованы путем введения класса EmbeddedDataSourceConfiguration через аннотацию @Import.
@Import({EmbeddedDataSourceConfiguration. class})

EmbeddedDataSourceConfiguration добавляет в контейнер встроенный источник данных Spring Boot, который поддерживает базы данных HSQL, H2 и DERBY, и некоторые из его кодов выглядят следующим образом.
@Configuration(
proxyBeanMethods = false
)
@EnableConfigurationProperties({DataSourceProperties.class})
public class EmbeddedDataSourceConfiguration реализует BeanClassLoaderAware { private ClassLoader classLoader; public EmbeddedDataSourceConfiguration() { } public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } //向Добавить встроенный источник данных Spring Boot в контейнер @Bean( destroyMethod = "shutdown" )











return (новый EmbeddedDatabaseBuilder()).setType(EmbeddedDatabaseConnection.get(this.classLoader).getType()).setName(properties.determineDatabaseName()).build();
}
}

Благодаря приведенному выше анализу мы знаем, что функция класса автоматической настройки EmbeddedDatabaseConfiguration заключается в добавлении встроенного источника данных (DataSource) в контейнер, но это условно.

Аннотация @Conditional также используется в классе EmbeddedDatabaseConfiguration, который использует класс внутреннего ограничения EmbeddedDatabaseCondition для DataSourceAutoConfiguration для условного суждения.
@Conditional({DataSourceAutoConfiguration.EmbeddedDatabaseCondition.class})

EmbeddedDatabaseCondition в основном используется для определения того, существует ли уже в контейнере объединенный источник данных (PooledDataSource). EmbeddedDatabaseConfiguration нельзя создать экземпляр, если в контейнере есть объединенный источник данных. EmbeddedDatabaseConfiguration может быть создан только в том случае, если в контейнере нет объединенного источника данных, и в контейнер можно добавить встроенный источник данных (EmbeddedDataSource).
PooledDataSourceConfiguration
PooledDataSourceConfiguration — это класс автоматической конфигурации для объединенных в пул источников данных.В этом классе используется аннотация @Conditional, которая использует класс внутреннего ограничения PooledDataSourceCondition DataSourceAutoConfiguration для условного суждения.
@Conditional({DataSourceAutoConfiguration. PooledDataSourceCondition. class})

PooledDataSourceCondition, как и EmbeddedDatabaseCondition, также используется для определения того, существует ли уже объединенный источник данных в контейнере, но отличие состоит в том, что PooledDataSourceConfiguration может быть создан и добавлен в контейнер только тогда, когда в контейнере есть объединенный источник данных.

Как и EmbeddedDatabaseConfiguration, в классе PooledDataSourceConfiguration нет реализации метода, и все его функции реализуются путем внедрения других классов через аннотацию @Import.
@Import({Hikari.class, Tomcat.class, Dbcp2.class, OracleUcp.class, Generic.class, DataSourceJmxConfiguration.class})

PooledDataSourceConfiguration представляет пять классов конфигурации источников данных Hikari, Tomcat, Dbcp2, OracleUcp и Generic через аннотацию @Import. Все они являются внутренними классами DataSourceConfiguration, и их функции аналогичны добавлению указанных источников данных в контейнер.

Возьмем Hikari в качестве примера для анализа.Исходный код Hikari выглядит следующим образом.
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({HikariDataSource.class})
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"},
имеяValue = "com.zaxxer.hikari.HikariDataSource ",
matchIfMissing = true
)
статический класс Hikari { Hikari () { } @Bean @ConfigurationProperties ( prefix = "spring.datasource.hikari" ) HikariDataSource dataSource (свойства DataSourceProperties) {







HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(свойства, HikariDataSource.class);
если (StringUtils.hasText (properties.getName ())) { dataSource.setPoolName (properties.getName ()); } вернуть источник данных; } }




В классе Hikari в основном используются следующие аннотации:
@Configuration: указывает, что текущий класс является классом конфигурации
@ConditionalOnMissingBean({DataSource.class}): указывает, что экземпляр класса конфигурации будет создан только при отсутствии пользователя. определенный источник данных в контейнере;
@ConditionalOnClass({HikariDataSource.class}) : указывает, что экземпляр Hikari будет создан только тогда, когда класс HikariDataSource существует в пути к классу. Класс HikariDataSource представлен spring-boot-starter-jdbc по умолчанию, поэтому, пока мы вводим стартер в pom.xml, будет создан экземпляр Hikari (это также использование HikariCP по умолчанию в Spring Boot 2.x в качестве его источник данных). ;
@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 добавляет компонент HikariDataSource в контейнер через аннотацию @Bean, а экземпляр объекта компонента получается путем вызова метода createDataSource() DataSourceConfiguration, код выглядит следующим образом.
@Bean
@ConfigurationProperties(
prefix = "spring.datasource.hikari"
)
HikariDataSource dataSource(DataSourceProperties свойства) { HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class); if (StringUtils.hasText(Name))) { dataSource.setPoolName(properties.getName()); } return dataSource; }





В методе createDataSource() вызовите initializeDataSourceBuilder() из DataSourceProperties, чтобы инициализировать DataSourceBuilder, исходный код выглядит следующим образом.
защищенный статический T createDataSource (свойства DataSourceProperties, тип Class<? extends DataSource>) { return properties.initializeDataSourceBuilder().type(type).build() ;

Метод initializeDataSourceBuilder() создает объект DataSourceBuilder, вызывая метод create() DataSourceBuilder, и устанавливает тип источника данных, имя класса драйвера, URL-адрес подключения, имя пользователя и пароль в последовательности, соответствующей конфигурации в файле конфигурации 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()).пароль(this.determinePassword()); }


Как упоминалось выше, spring.datasource.type по умолчанию можно настроить без настройки, поэтому после того, как метод createDataSource() получит возвращенный объект DataSourceBuilder, ему необходимо снова установить для атрибута type значение HikariDataSource и вызвать метод build() метода DataSourceBuilder. для завершения инициализации HikariDataSource.

вставьте сюда описание изображения

Рисунок 1: Инициализация HikariDataSource

Метод dataSource() получает объект источника данных, задает имя пула соединений (имя) и внедряет его в контейнер.

Рисунок 2: Установка имени пула соединений

вставьте сюда описание изображения

С тех пор мы завершили анализ принципа автоматической настройки источника данных Spring Boot.

Резюме
Анализируя принцип автоматической настройки источника данных Spring Boot, мы видим, что
если пользователь не настроит источник данных, если в контейнере есть класс HikariDataSource, Spring Boot автоматически создаст экземпляр Hikari и будет использовать его в качестве своего источник данных.
Стартер сцены JDBC Spring Boot (spring-boot-starter-data-jdbc) вводит источник данных HikariCP (включая класс HikariDataSource) по умолчанию через spring-boot-starter-jdbc, поэтому Spring Boot по умолчанию использует HikariCP в качестве источника данных.

Supongo que te gusta

Origin blog.csdn.net/weixin_64842782/article/details/125106982
Recomendado
Clasificación