Skip to content

Commit 6d2d8a3

Browse files
violetbeachsbrannen
authored andcommitted
Introduce initialize() in AbstractRouting[DataSource|ConnectionFactory]
This commit introduces initialize() methods in AbstractRoutingDataSource and AbstractRoutingConnectionFactory as an alternative to invoking afterPropertiesSet(). Closes gh-31248
1 parent af0b39a commit 6d2d8a3

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,15 @@ public void setDataSourceLookup(@Nullable DataSourceLookup dataSourceLookup) {
116116

117117
@Override
118118
public void afterPropertiesSet() {
119+
initialize();
120+
}
121+
122+
/**
123+
* Synchronizes targetDataSources to resolvedDataSources
124+
* and defaultTargetDataSource to resolvedDefaultDataSource.
125+
* @throws IllegalArgumentException in case of targetDataSources is null
126+
*/
127+
public void initialize() {
119128
if (this.targetDataSources == null) {
120129
throw new IllegalArgumentException("Property 'targetDataSources' is required");
121130
}

spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,31 @@ protected Object determineCurrentLookupKey() {
146146
assertThat(routingDataSource.determineTargetDataSource()).isSameAs(ds);
147147
}
148148

149+
@Test
150+
void testInitialize_synchronizeTargetDataSourcesToResolvedDataSources() {
151+
AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() {
152+
@Override
153+
protected Object determineCurrentLookupKey() {
154+
return null;
155+
}
156+
};
157+
158+
DataSource ds1 = new StubDataSource();
159+
DataSource ds2 = new StubDataSource();
160+
161+
Map<Object, Object> targetDataSources = new HashMap<>();
162+
targetDataSources.put("ds1", ds1);
163+
targetDataSources.put("ds2", ds2);
164+
routingDataSource.setTargetDataSources(targetDataSources);
165+
166+
routingDataSource.initialize();
167+
168+
Map<Object, DataSource> resolvedDataSources = routingDataSource.getResolvedDataSources();
169+
assertThat(resolvedDataSources).hasSize(2);
170+
assertThat(resolvedDataSources.get("ds1")).isSameAs(ds1);
171+
assertThat(resolvedDataSources.get("ds2")).isSameAs(ds2);
172+
}
173+
149174
@Test
150175
public void notInitialized() {
151176
AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() {

spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ public void setConnectionFactoryLookup(ConnectionFactoryLookup connectionFactory
127127

128128
@Override
129129
public void afterPropertiesSet() {
130+
initialize();
131+
}
132+
133+
/**
134+
* Synchronizes targetConnectionFactories to resolvedConnectionFactories
135+
* and defaultTargetConnectionFactory to resolvedDefaultConnectionFactory.
136+
*/
137+
public void initialize() {
130138
Assert.notNull(this.targetConnectionFactories, "Property 'targetConnectionFactories' must not be null");
131139

132140
this.resolvedConnectionFactories = CollectionUtils.newHashMap(this.targetConnectionFactories.size());

spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactoryUnitTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,19 @@ public void shouldAllowModificationsAfterInitialization() {
182182
.verifyComplete();
183183
}
184184

185+
@Test
186+
void testInitialize_shouldDetermineRoutedFactory() {
187+
connectionFactory.setTargetConnectionFactories(
188+
singletonMap("key", routedConnectionFactory));
189+
connectionFactory.setConnectionFactoryLookup(new MapConnectionFactoryLookup());
190+
connectionFactory.initialize();
191+
192+
connectionFactory.determineTargetConnectionFactory()
193+
.contextWrite(Context.of(ROUTING_KEY, "key"))
194+
.as(StepVerifier::create)
195+
.expectNext(routedConnectionFactory)
196+
.verifyComplete();
197+
}
185198

186199
static class DummyRoutingConnectionFactory extends AbstractRoutingConnectionFactory {
187200

0 commit comments

Comments
 (0)