Подтвердить что ты не робот

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

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

<context:component-scan base-package="foo.bar">
    <context:exclude-filter type="annotation" expression="o.s.s.Service"/>
</context:component-scan>
<context:component-scan base-package="foo.baz" />

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Альтернативой является то, что вы можете использовать аннотацию @org.springframework.context.annotation.Import в первом классе Config для импорта второго класса 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)