简体   繁体   中英

How to externalize @SpringBootApplication configuration?

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 profiles, where only one loads the database.

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 {
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM