Skip to content

Commit 4b5e50b

Browse files
OlgaMaciaszekwilkinsona
authored andcommitted
Instrument user-created DataSource for checkpoint-restore
See gh-37630
1 parent 29ff01e commit 4b5e50b

File tree

4 files changed

+84
-9
lines changed

4 files changed

+84
-9
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,14 @@
5151
* @author Phillip Webb
5252
* @author Stephane Nicoll
5353
* @author Kazuki Shimizu
54+
* @author Olga Maciaszek-Sharma
5455
* @since 1.0.0
5556
*/
5657
@AutoConfiguration(before = SqlInitializationAutoConfiguration.class)
5758
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
5859
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
5960
@EnableConfigurationProperties(DataSourceProperties.class)
60-
@Import(DataSourcePoolMetadataProvidersConfiguration.class)
61+
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceCheckpointRestoreConfiguration.class })
6162
public class DataSourceAutoConfiguration {
6263

6364
@Configuration(proxyBeanMethods = false)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright 2012-2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.jdbc;
18+
19+
import javax.sql.DataSource;
20+
21+
import com.zaxxer.hikari.HikariDataSource;
22+
23+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnCheckpointRestore;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
26+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
27+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
28+
import org.springframework.boot.jdbc.HikariCheckpointRestoreLifecycle;
29+
import org.springframework.context.annotation.Bean;
30+
import org.springframework.context.annotation.Configuration;
31+
32+
/**
33+
* Checkpoint-restore specific configuration.
34+
*
35+
* @author Olga Maciaszek-Sharma
36+
* @since 3.2.0
37+
*/
38+
@Configuration(proxyBeanMethods = false)
39+
@ConditionalOnCheckpointRestore
40+
@ConditionalOnBean(DataSource.class)
41+
public class DataSourceCheckpointRestoreConfiguration {
42+
43+
@Configuration(proxyBeanMethods = false)
44+
@ConditionalOnClass(HikariDataSource.class)
45+
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
46+
matchIfMissing = true)
47+
static class Hikari {
48+
49+
@Bean
50+
@ConditionalOnMissingBean
51+
HikariCheckpointRestoreLifecycle hikariCheckpointRestoreLifecycle(DataSource dataSource) {
52+
return new HikariCheckpointRestoreLifecycle(dataSource);
53+
}
54+
55+
}
56+
57+
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@
2525
import oracle.ucp.jdbc.PoolDataSourceImpl;
2626

2727
import org.springframework.beans.factory.ObjectProvider;
28-
import org.springframework.boot.autoconfigure.condition.ConditionalOnCheckpointRestore;
2928
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3029
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3130
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3231
import org.springframework.boot.context.properties.ConfigurationProperties;
3332
import org.springframework.boot.jdbc.DataSourceBuilder;
3433
import org.springframework.boot.jdbc.DatabaseDriver;
35-
import org.springframework.boot.jdbc.HikariCheckpointRestoreLifecycle;
3634
import org.springframework.context.annotation.Bean;
3735
import org.springframework.context.annotation.Configuration;
3836
import org.springframework.util.StringUtils;
@@ -124,12 +122,6 @@ HikariDataSource dataSource(DataSourceProperties properties, JdbcConnectionDetai
124122
return dataSource;
125123
}
126124

127-
@Bean
128-
@ConditionalOnCheckpointRestore
129-
HikariCheckpointRestoreLifecycle hikariCheckpointRestoreLifecycle(DataSource hikariDataSource) {
130-
return new HikariCheckpointRestoreLifecycle(hikariDataSource);
131-
}
132-
133125
}
134126

135127
/**

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/HikariDataSourceConfigurationTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.beans.BeansException;
2626
import org.springframework.beans.factory.config.BeanPostProcessor;
2727
import org.springframework.boot.autoconfigure.AutoConfigurations;
28+
import org.springframework.boot.jdbc.DataSourceBuilder;
2829
import org.springframework.boot.jdbc.HikariCheckpointRestoreLifecycle;
2930
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3031
import org.springframework.boot.testsupport.classpath.ClassPathOverrides;
@@ -42,6 +43,7 @@
4243
* @author Moritz Halbritter
4344
* @author Andy Wilkinson
4445
* @author Phillip Webb
46+
* @author Olga Maciaszek-Sharma
4547
*/
4648
class HikariDataSourceConfigurationTests {
4749

@@ -148,6 +150,14 @@ void whenCheckpointRestoreIsNotAvailableHikariAutoConfigDoesNotRegisterLifecycle
148150
.run((context) -> assertThat(context).doesNotHaveBean(HikariCheckpointRestoreLifecycle.class));
149151
}
150152

153+
@Test
154+
@ClassPathOverrides("org.crac:crac:1.3.0")
155+
void whenCheckpointRestoreIsAvailableAndDataSourceInstantiatedByUserHikariAutoConfigRegistersLifecycleBean() {
156+
this.contextRunner.withUserConfiguration(UserDataSourceConfiguration.class)
157+
.withPropertyValues("spring.datasource.type=" + HikariDataSource.class.getName())
158+
.run((context) -> assertThat(context).hasSingleBean(HikariCheckpointRestoreLifecycle.class));
159+
}
160+
151161
@Configuration(proxyBeanMethods = false)
152162
static class ConnectionDetailsConfiguration {
153163

@@ -178,4 +188,19 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro
178188

179189
}
180190

191+
@Configuration(proxyBeanMethods = false)
192+
static class UserDataSourceConfiguration {
193+
194+
@Bean
195+
DataSource dataSource() {
196+
return DataSourceBuilder.create()
197+
.driverClassName("org.postgresql.Driver")
198+
.url("jdbc:postgresql://localhost:5432/database")
199+
.username("user")
200+
.password("password")
201+
.build();
202+
}
203+
204+
}
205+
181206
}

0 commit comments

Comments
 (0)