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 cc71ba2c9d18..81aee2588bf6 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 void setDataSourceLookup(@Nullable DataSourceLookup dataSourceLookup) { @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 8dc23a3f9651..bdb8e5939314 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 @@ protected Object determineCurrentLookupKey() { 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 ef285a5c47f1..9d55d01edfaf 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 void setConnectionFactoryLookup(ConnectionFactoryLookup connectionFactory @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 ecadb882327b..0b7009b7fb58 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 void shouldAllowModificationsAfterInitialization() { .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 {