Introduce initialize() in AbstractRouting[DataSource|ConnectionFactory]
This commit introduces initialize() methods in AbstractRoutingDataSource and AbstractRoutingConnectionFactory as an alternative to invoking afterPropertiesSet(). Closes gh-31248
This commit is contained in:
@@ -116,6 +116,15 @@ public abstract class AbstractRoutingDataSource extends AbstractDataSource imple
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
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) {
|
if (this.targetDataSources == null) {
|
||||||
throw new IllegalArgumentException("Property 'targetDataSources' is required");
|
throw new IllegalArgumentException("Property 'targetDataSources' is required");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,6 +146,31 @@ class AbstractRoutingDataSourceTests {
|
|||||||
assertThat(routingDataSource.determineTargetDataSource()).isSameAs(ds);
|
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
|
@Test
|
||||||
public void notInitialized() {
|
public void notInitialized() {
|
||||||
AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() {
|
AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() {
|
||||||
|
|||||||
@@ -127,6 +127,14 @@ public abstract class AbstractRoutingConnectionFactory implements ConnectionFact
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
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");
|
Assert.notNull(this.targetConnectionFactories, "Property 'targetConnectionFactories' must not be null");
|
||||||
|
|
||||||
this.resolvedConnectionFactories = CollectionUtils.newHashMap(this.targetConnectionFactories.size());
|
this.resolvedConnectionFactories = CollectionUtils.newHashMap(this.targetConnectionFactories.size());
|
||||||
|
|||||||
@@ -182,6 +182,19 @@ public class AbstractRoutingConnectionFactoryUnitTests {
|
|||||||
.verifyComplete();
|
.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 {
|
static class DummyRoutingConnectionFactory extends AbstractRoutingConnectionFactory {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user