SpringBoot excludeFilter не работает с несколькими классами конфигурации

Я разрабатываю приложение Springboot, которое зависит от другого приложения Springboot. Я хочу включить большинство компонентов в родительское приложение Springboot, кроме одного.

Как я могу исключить один bean-компонент Springboot, который родительский пакет сканировал, не затрагивая класс ParentApplication?

Способы, которые я пробовал, но не работает:

1: использование фильтрации исключений в моем классе приложения для фильтрации конкретного класса бина.

2: я также попытался исключить и класс бина и родительский класс конфигурации.

3: добавить интерфейс DisposableBean к классу бина, который я хочу исключить и уничтожить во время выполнения.

ниже мой начальный класс конфигурации приложения и родительский класс.

мой MyApplication.class: пакет com.myapp;

@ComponentScan(
    basePackages = {"com.parent",{my own packages..}},
    excludeFilters= {
    @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value= {TheClassToExclude.class}),
    @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value= {ParentApplication.class})}   
)
@SpringBootApplication(exclude=ParentApplication.class)
public class MyApplication{

public static void main(String[] args) {
    SpringApplication.run(MyApplication.class, args);
}

@PostConstruct
public void init() {
    System.out.println("App is initialized.");
}

}

мой ParentApplication.class

    package com.parent;


    @EnableRetry
    @EnableScheduling
    @SpringBootApplication(exclude = { HibernateJpaAutoConfiguration.class })
    @ComponentScan(basePackages = {all the base package including the TheClassToExclude}
    @PropertySource({all resources})
    public class ParentApplication {

    public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    }
    @PostConstruct
    public void haha() {
        System.out.println("configuration class created");
    }

Консоль выводит: "создан класс конфигурации", поэтому ParentApplication по какой-то причине инициируется Springboot, так же как и класс, который я хочу исключить.

1 ответ

просто для справки - я думаю, что, поскольку оба класса аннотированы @SpringBootApplication, таким образом, оба @Configurationклассы и будут принимать участие в автоматическом сканировании компонентов Spring - и неясно, какой из этих классов будет просканирован первым, чтобы «исключить» другой - если ... вы явно не укажете точку входа и, следовательно, первый класс SpringBootApplication для загрузки, как здесь

Вы можете увидеть, какие классы создаются при сканировании компонентов Spring и в каком порядке, установив logging.level.org.springframework = DEBUG в application.properties

Другие вопросы по тегам