2013-04-26 3 views
32

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

<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.

ответ

38

Вам просто нужно создать два класса 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 { 
} 

тогда, когда инстанцировании пружинный контекст вас будут делать следующее:

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

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

Что происходит в 'Service.class'? – Deepen

Смежные вопросы