Description
This was originally reported by a Spring Cloud user (someone trying to upgrade the Petclinic microservice edition to Spring Boot 2.0 - so it works with 1.5): spring-cloud/spring-cloud-commons#355.
I'm still a bit mystified as to why it happens, but the evidence is pointing to something in the DataSourceInitializer
and its configuration (there's a BeanPostProcessor
that forcibly instantiates the DataSourceInitializerInvoker
when it sees a DataSource
).
Here's a really small app that blows up in the same way (with no Spring Cloud dependencies). You need a schema.sql
and a data.sql
to make it fail, and you need to set spring.datasource.initialization-mode=embedded
(or always
) to trigger the initialization. Dependencies are just h2 and the JPA starter.
@SpringBootApplication
public class BeanApplication {
@Bean
public static BeanFactoryPostProcessor fooScope() {
return beanFactory -> {
beanFactory.registerScope("foo", new SimpleThreadScope());
};
}
@Bean
@Scope("foo")
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariDataSource dataSource(DataSourceProperties properties) {
HikariDataSource dataSource = properties.initializeDataSourceBuilder()
.type(HikariDataSource.class).build();
return dataSource;
}
public static void main(String[] args) {
SpringApplication.run(BeanApplication.class, args);
}
}
If you (exclude= {HibernateJpaAutoConfiguration.class, JpaRepositoriesAutoConfiguration.class})
the problem goes away. Here's some code in github: https://github.com/scratches/datasource-cycle.
While I was investigating the Cloud issue I also managed to find some combinations of auto configurations that led to other cycles (not involving JPA, but still with a scoped data source), so there is more than one way to tickle this.