Reputation: 86747
I want to externalize the @SpringBootApplication(exclude...)
option, to have a reusable class or annotation that I could throw in to exclude any database/hibernate initialization.
So, instead of writing:
@SpringBootApplication(
exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
public class MainApp {
}
I would like to create a annotation that I could apply to my @SpringBootApplication
main class:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@EnableAutoConfiguration(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
@Configuration
public @interface ExcludeDataSources {
}
And then enable this feature by annotation:
@SpringBootApplication
@ExcludeDataSources
public class MainApp {
}
Problem: the annotation approach does not work, and spring still tries to load a database. Why?
My final goal is to have multiple startup classes, where only one loads the database.
Upvotes: 0
Views: 165
Reputation: 86747
I could manage it by adding an additional @EnableAutoConfiguration
that is only executed on a certain condition.
This way I can dynamically exclude the database config, while keeping a clean basis main @SpringBootConfiguration
class.
public class DataSourceConfig {
@Configuration
@Conditional(MyCondition.class)
@EnableAutoConfiguration(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
static class ExcludeDataSource {
}
}
Upvotes: 2