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