code: @Override
  	protected DataSource createInstance() throws Exception {
  		DBInstance dbInstance = getDbInstance(getDbInstanceIdentifier());
  
  		// If there is no read replica available, delegate to super class
  		if (dbInstance.getReadReplicaDBInstanceIdentifiers().isEmpty()) {
  			return super.createInstance();
  		}
  
  		HashMap<Object, Object> replicaMap = new HashMap<>(
  				dbInstance.getReadReplicaDBInstanceIdentifiers().size());
  
  		for (String replicaName : dbInstance.getReadReplicaDBInstanceIdentifiers()) {
  			replicaMap.put(replicaName, createDataSourceInstance(replicaName));
  		}
  
  		// Create the data source
  		ReadOnlyRoutingDataSource dataSource = new ReadOnlyRoutingDataSource();
  		dataSource.setTargetDataSources(replicaMap);
  		dataSource.setDefaultTargetDataSource(
  				createDataSourceInstance(getDbInstanceIdentifier()));
  
  		// Initialize the class
  		dataSource.afterPropertiesSet();
  
  		return new LazyConnectionDataSourceProxy(dataSource);
  	}
docs: Constructs a
  {@link org.springframework.cloud.aws.jdbc.datasource.ReadOnlyRoutingDataSource}
  data source that contains the regular data source as a default, and all
  read-replicas as additional data source. The
  {@link org.springframework.cloud.aws.jdbc.datasource.ReadOnlyRoutingDataSource} is
  additionally wrapped with a
  {@link org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy}, because
  the read-only flag is only available after the transactional context has been
  established. This is only the case if the physical connection is requested after
  the transaction start and not while starting a transaction.
  @return a ReadOnlyRoutingDataSource that is wrapped with a
  LazyConnectionDataSourceProxy
  @throws Exception if the underlying data source setup throws any exception