Фильтровать определенные пакеты в @ComponentScan

Я хочу переключиться с XML на основе Java на основе конфигурации весной. Теперь у нас есть что-то подобное в контексте нашего приложения:

    

Но если я напишу что-то вроде этого …

  @ComponentScan( basePackages = {"foo.bar", "foo.baz"}, excludeFilters = @ComponentScan.Filter( value= Service.class, type = FilterType.ANNOTATION ) ) 

… он исключит службы из обоих пакетов. У меня есть сильное чувство, что я пропускаю что-то неловко тривиальное, но я не мог найти решение ограничить область действия фильтра foo.bar .

Вам просто нужно создать два classа Config для двух аннотаций @ComponentScan которые вам нужны.

Например, у вас будет один class Config для вашего пакета foo.bar :

 @Configuration @ComponentScan(basePackages = {"foo.bar"}, excludeFilters = @ComponentScan.Filter(value = Service.class, type = FilterType.ANNOTATION) ) public class FooBarConfig { } 

а затем второй class Config для вашего пакета foo.baz :

 @Configuration @ComponentScan(basePackages = {"foo.baz"}) public class FooBazConfig { } 

то при создании экземпляра Spring вы будете делать следующее:

 new AnnotationConfigApplicationContext(FooBarConfig.class, FooBazConfig.class); 

Альтернативой является то, что вы можете использовать аннотацию @org.springframework.context.annotation.Import в первом classе Config для импорта второго classа Config . Так, например, вы можете изменить FooBarConfig следующим образом:

 @Configuration @ComponentScan(basePackages = {"foo.bar"}, excludeFilters = @ComponentScan.Filter(value = Service.class, type = FilterType.ANNOTATION) ) @Import(FooBazConfig.class) public class FooBarConfig { } 

Затем вы просто начнете свой контекст с:

 new AnnotationConfigApplicationContext(FooBarConfig.class) 
  • Модель дизайна Singleton vs Singleton beans в весеннем контейнере
  • Давайте будем гением компьютера.