Skip to content

2.4-2.5: Initialization ordering #120

Closed
@fabapp2

Description

@fabapp2

Spring Boot 2.4 to 2.5 upgrade - Initialization ordering

Spring Boot 2.5 Release Notes

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions