From 6d2d8a36c2b608e0c127efa20ef9ea8f8238ff84 Mon Sep 17 00:00:00 2001 From: Lee Jaeheon Date: Sat, 16 Sep 2023 23:26:56 +0900 Subject: [PATCH] Introduce initialize() in AbstractRouting[DataSource|ConnectionFactory] This commit introduces initialize() methods in AbstractRoutingDataSource and AbstractRoutingConnectionFactory as an alternative to invoking afterPropertiesSet(). Closes gh-31248 --- .../lookup/AbstractRoutingDataSource.java | 9 +++++++ .../AbstractRoutingDataSourceTests.java | 25 +++++++++++++++++++ .../AbstractRoutingConnectionFactory.java | 8 ++++++ ...ractRoutingConnectionFactoryUnitTests.java | 13 ++++++++++ 4 files changed, 55 insertions(+) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.java index cc71ba2c9d1..81aee2588bf 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.java @@ -116,6 +116,15 @@ public abstract class AbstractRoutingDataSource extends AbstractDataSource imple @Override public void afterPropertiesSet() { + initialize(); + } + + /** + * Synchronizes targetDataSources to resolvedDataSources + * and defaultTargetDataSource to resolvedDefaultDataSource. + * @throws IllegalArgumentException in case of targetDataSources is null + */ + public void initialize() { if (this.targetDataSources == null) { throw new IllegalArgumentException("Property 'targetDataSources' is required"); } diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java index 8dc23a3f965..bdb8e593931 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java @@ -146,6 +146,31 @@ class AbstractRoutingDataSourceTests { assertThat(routingDataSource.determineTargetDataSource()).isSameAs(ds); } + @Test + void testInitialize_synchronizeTargetDataSourcesToResolvedDataSources() { + AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() { + @Override + protected Object determineCurrentLookupKey() { + return null; + } + }; + + DataSource ds1 = new StubDataSource(); + DataSource ds2 = new StubDataSource(); + + Map targetDataSources = new HashMap<>(); + targetDataSources.put("ds1", ds1); + targetDataSources.put("ds2", ds2); + routingDataSource.setTargetDataSources(targetDataSources); + + routingDataSource.initialize(); + + Map resolvedDataSources = routingDataSource.getResolvedDataSources(); + assertThat(resolvedDataSources).hasSize(2); + assertThat(resolvedDataSources.get("ds1")).isSameAs(ds1); + assertThat(resolvedDataSources.get("ds2")).isSameAs(ds2); + } + @Test public void notInitialized() { AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() { diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactory.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactory.java index ef285a5c47f..9d55d01edfa 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactory.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactory.java @@ -127,6 +127,14 @@ public abstract class AbstractRoutingConnectionFactory implements ConnectionFact @Override public void afterPropertiesSet() { + initialize(); + } + + /** + * Synchronizes targetConnectionFactories to resolvedConnectionFactories + * and defaultTargetConnectionFactory to resolvedDefaultConnectionFactory. + */ + public void initialize() { Assert.notNull(this.targetConnectionFactories, "Property 'targetConnectionFactories' must not be null"); this.resolvedConnectionFactories = CollectionUtils.newHashMap(this.targetConnectionFactories.size()); diff --git a/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactoryUnitTests.java b/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactoryUnitTests.java index ecadb882327..0b7009b7fb5 100644 --- a/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactoryUnitTests.java +++ b/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactoryUnitTests.java @@ -182,6 +182,19 @@ public class AbstractRoutingConnectionFactoryUnitTests { .verifyComplete(); } + @Test + void testInitialize_shouldDetermineRoutedFactory() { + connectionFactory.setTargetConnectionFactories( + singletonMap("key", routedConnectionFactory)); + connectionFactory.setConnectionFactoryLookup(new MapConnectionFactoryLookup()); + connectionFactory.initialize(); + + connectionFactory.determineTargetConnectionFactory() + .contextWrite(Context.of(ROUTING_KEY, "key")) + .as(StepVerifier::create) + .expectNext(routedConnectionFactory) + .verifyComplete(); + } static class DummyRoutingConnectionFactory extends AbstractRoutingConnectionFactory {