Я столкнулся с той же проблемой, что и у вас, с той разницей, что я не использую DataSourceAutoConfiguration.
Я не эксперт по Spring, поэтому не могу сообщить вам причину root. Но я смог заставить свой код работать, перейдя из чего-то вроде этого, которое похоже на то, что вы опубликовали:
@Bean
@Primary
DataSource dataSource(@Qualifier("firstDS") DataSource firstDS,
@Qualifier("secondDS") DataSource secondDS) {
MyRoutingDataSource ds = new MyRoutingDataSource();
ds.setFirstDS(firstDS);
ds.setSecondDs(secondDS);
return ds;
}
@Bean("firstDS")
public DataSource firstDS() {
return /*create first DS*/
}
@Bean("secondDS")
public DataSource secondDs(DataSourceProperties properties) {
return /*create second DS*/
}
На это:
@Bean
DataSource dataSource() {
DataSource first = /*create first DS*/
DataSource second = /*create second DS*/
MyRoutingDataSource ds = new MyRoutingDataSource();
ds.setFirstDS(first);
ds.setSecondDs(second);
return ds;
}
Как вы можете видеть Я смог решить эту проблему, имея только один компонент Spring типа DataSource. Я создал два «первых» и «вторых» источника данных внутри метода, который создает источник данных маршрутизации, чтобы они не были бинами Spring. Наличие только одного компонента типа DataSource избавило меня от ошибки циклической зависимости.
Это решило мою проблему, но вы также хотите использовать DataSourceAutoConfiguration.
Я думаю, что вы сможете достичь этого с помощью что-то вроде этого:
@Bean
DataSource dataSource(@Qualifier("firstDSproperties") DataSourceProperties firstDSprops,
@Qualifier("secondDSproperties") DataSourceProperties secondDSprops) {
DataSource first = firstDSprops.initializeDataSourceBuilder().build();
DataSource second = secondDSprops.initializeDataSourceBuilder().build();
MyRoutingDataSource ds = new MyRoutingDataSource();
ds.setCurrentDS(firstDS);
return ds;
}
@Bean("firstDSproperties")
@ConfigurationProperties("datasource.first")
public DataSourceProperties firstDataSourceProperties() {
return new DataSourceProperties();
}
@Bean("secondDSproperties")
@ConfigurationProperties("datasource.second")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
Этот код делает два компонента типа DataSourceProperties вместо типа DataSource. С bean-компонентами DataSourceProperties вы все еще можете позволить Spring автоматически подключать конфигурацию, не вызывая (надеюсь) проблемы циклической зависимости, вызванной наличием нескольких bean-компонентов типа DataSource, зависящих друг от друга.
Я не тестировал это с DataSourceProperties я не использую DataSourceAutoConfiguration в моем коде. Но, основываясь на вашем коде, я думаю, что это может сработать.