Closed
Description
Spring Boot 2.4 to 2.5 upgrade - Initialization ordering
Beans of certain well-known types, such as JdbcTemplate
, will be ordered so that they are initialized after the database has been initialized. If you have a bean that works with the DataSource
directly, annotate its class or @Bean
method with @DependsOnDatabaseInitialization
to ensure that it too is initialized after the database has been initialized.
Scenarios
Java Bean definition using DataSource or subtype provided as method parameter
@Configuration
public class MyConfig {
@Bean
String someBean(DataSource ds) {
return "";
}
}
@Configuration
public class MyConfig {
@Bean
@DependsOnDatabaseInitialization
String someBean(DataSource ds) {
return "";
}
}
Java Bean definition using DataSource or subtype retrieved through method call
@Configuration
public class MyConfig {
@Bean
String someBean() {
DataSource ds = dataSource();
return "";
}
@Bean
DataSource dataSource() {
return null;
}
}
@Configuration
public class MyConfig {
@Bean
@DependsOnDatabaseInitialization
String someBean() {
DataSource ds = dataSource();
return "";
}
@Bean
DataSource dataSource() {
return null;
}
}
Java Bean definition using DataSource or subtype from member
@Configuration
public class MyConfig {
@Autowired
private DataSource ds;
@Bean
MyBean myBean() {
return new MyBean(ds);
}
}
@Configuration
public class MyConfig {
@Autowired
private DataSource ds;
@Bean
@DependsOnDatabaseInitialization
MyBean myBean() {
return new MyBean(ds);
}
}
Java bean definition with @SpringBootConfiguration
@SpringBootConfiguration
public class MyConfig {
@Autowired
private DataSource ds;
@Bean
MyBean myBean() {
return new MyBean(ds);
}
}
@SpringBootConfiguration
public class MyConfig {
@Autowired
private DataSource ds;
@Bean
@DependsOnDatabaseInitialization
MyBean myBean() {
return new MyBean(ds);
}
}
Spring Bean with component annotation and dependency on DataSource
@Component
public class MyComponent {
private DataSource ds;
public setDataSource(DataSource ds) {...}
}
@Component
@DependsOnDatabaseInitialization
public class MyComponent {
private DataSource ds;
public setDataSource(DataSource ds) {...}
}
- Find beans depending on any class of type
DataSource
(or subtypes) and Mark these bean definitions with@DependsOnDatabaseInitialization