2013-04-26 12 views
32

Desidero passare dalla configurazione basata su XML a quella basata su Java in primavera. Ora abbiamo qualcosa di simile nel nostro contesto di applicazione:Pacchetti specifici del filtro in @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" /> 

Ma se scrivo qualcosa di simile ...

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

... Sarà escludere i servizi da entrambi pacchetti. Ho la netta sensazione di trascurare qualcosa di imbarazzante, ma non sono riuscito a trovare una soluzione per limitare l'ambito del filtro a foo.bar.

risposta

38

È sufficiente creare due classi Config per le due annotazioni @ComponentScan necessarie.

Così, per esempio si avrebbe uno Config classe per il pacchetto foo.bar:

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

e poi una seconda Config classe per il pacchetto foo.baz:

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

poi quando un'istanza contesto primavera si farebbe quanto segue:

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

Un'alternativa è che è possibile utilizzare l'annotazione @org.springframework.context.annotation.Import nella prima classe Config per importare la seconda classe Config. Così, per esempio si potrebbe cambiare FooBarConfig essere:

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

allora si sarebbe semplicemente avviare il contesto con:

new AnnotationConfigApplicationContext(FooBarConfig.class) 
+0

Cosa succede a 'Service.class'? – Deepen

Problemi correlati