Spring пытается инициализировать все ваши источники данных при загрузке приложения, поскольку создание этих источников данных зависит от самих источников данных, что создает круговую зависимость.
Еще можно попробовать создать файл свойств длянапример, каждый арендатор в 'resources / tenants', в котором десять содержит имя базы данных, URL, пароль и имя пользователя этой конкретной базы данных.
В вашей MultitenantConfiguration под dataSource () вы можете затем прочитать эти файлы и создатьисточники данных, основанные на этом, что-то вроде этого:
ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = resolver.getResources("classpath*:/tenants/*.properties") ;
Map<Object,Object> resolvedDataSources = new HashMap<>();
for(Resource propertyFile : resources) {
Properties tenantProperties = new Properties();
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(this.getClass().getClassLoader());
try {
tenantProperties.load(propertyFile.getInputStream());
String tenantId = tenantProperties.getProperty("name");
// Assumption: The tenant database uses the same driver class
// as the default database that you configure.
dataSourceBuilder.driverClassName(properties.getDriverClassName())
.url(tenantProperties.getProperty("spring.datasource.url"))
.username(tenantProperties.getProperty("spring.datasource.username"))
.password(tenantProperties.getProperty("spring.datasource.password"));
if(properties.getType() != null) {
dataSourceBuilder.type(properties.getType());
}
resolvedDataSources.put(tenantId, dataSourceBuilder.build());
} catch (IOException e) {
// Ooops, tenant could not be loaded. This is bad.
// Stop the application!
e.printStackTrace();
return null;
}
Я понимаю, что это не отвечает на ваш вопрос так, как вы хотите, но я думаю, что это лучший способ избежать круговой зависимости.
Надеюсь, это тебе поможет!