Browse Source

Introduce initialize() in AbstractRouting[DataSource|ConnectionFactory]

This commit introduces initialize() methods in
AbstractRoutingDataSource and AbstractRoutingConnectionFactory as an
alternative to invoking afterPropertiesSet().

Closes gh-31248
pull/31320/head
Lee Jaeheon 2 years ago committed by Sam Brannen
parent
commit
6d2d8a36c2
  1. 9
      spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.java
  2. 25
      spring-jdbc/src/test/java/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSourceTests.java
  3. 8
      spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactory.java
  4. 13
      spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/lookup/AbstractRoutingConnectionFactoryUnitTests.java

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

@ -116,6 +116,15 @@ public abstract class AbstractRoutingDataSource extends AbstractDataSource imple @@ -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");
}

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

@ -146,6 +146,31 @@ class AbstractRoutingDataSourceTests { @@ -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<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("ds1", ds1);
targetDataSources.put("ds2", ds2);
routingDataSource.setTargetDataSources(targetDataSources);
routingDataSource.initialize();
Map<Object, DataSource> 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() {

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

@ -127,6 +127,14 @@ public abstract class AbstractRoutingConnectionFactory implements ConnectionFact @@ -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());

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

@ -182,6 +182,19 @@ public class AbstractRoutingConnectionFactoryUnitTests { @@ -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 {

Loading…
Cancel
Save