2012-05-23 17 views
52

C'è un modo semplice per escludere un pacchetto/sottoprogetto da autowiring in Spring 3.1?Escludere i pacchetti secondari da Autowiring di Spring?

Es., Se volessi includere una scansione componenti con un pacchetto base di com.example esiste un modo semplice per escludere com.example.ignore?

(Perché? Mi piacerebbe di escludere alcuni componenti dai miei test di integrazione)

risposta

64

Non sono sicuro che è possibile escludere i pacchetti in modo esplicito con una < escludere filtro >, ma scommetto utilizzando un filtro regex sarebbe effettivamente arrivare lì:

<context:component-scan base-package="com.example"> 
    <context:exclude-filter type="regex" expression="com\.example\.ignore\..*"/> 
</context:component-scan> 

Per rendere più annotazioni-based, si sarebbe annotare ogni classe che si desidera escludere per i test di integrazione con qualcosa come @ com.example.annotation.ExcludedFromITests. Poi la componente-scan sarà simile:

<context:component-scan base-package="com.example"> 
    <context:exclude-filter type="annotation" expression="com.example.annotation.ExcludedFromITests"/> 
</context:component-scan> 

Questo è più chiaro perché ora hai documentato nel codice sorgente in sé che la classe non è destinato ad essere inserito in un contesto domanda di test di integrazione.

10

Questo funziona in primavera 3.0.5. Così, penserei che avrebbe funzionato a 3,1

<context:component-scan base-package="com.example"> 
    <context:exclude-filter type="aspectj" expression="com.example.dontscanme.*" /> 
</context:component-scan> 
+0

Attenzione che ignora silenziosamente l'esclusione nel caso in cui aspettoj non sia presente su classpath. – Vadzim

4

penso che si dovrebbe refactoring i pacchetti in gerarchia più conveniente, quindi sono fuori dal pacchetto base.

Ma se non si può fare questo, provare:

<context:component-scan base-package="com.example"> 
    ... 
    <context:exclude-filter type="regex" expression="com\.example\.ignore.*"/> 
</context:component-scan> 

Qui potrete trovare altri esempi: Using filters to customize scanning

+0

Grazie, in linea di principio, sono d'accordo con l'idea del refactoring-- era il mio primo pensiero. Sfortunatamente, non è davvero una buona opzione per la mia situazione particolare. – HolySamosa

+0

Un buon design del pacchetto può evitare queste situazioni, ma se non è possibile ... non si può avere ahaha :) :) – richarbernal

39

Sto usando @ComponentScan come segue per lo stesso caso d'uso. Questa è la risposta XML BenSchro10's ma utilizza le annotazioni. Entrambi usano un filtro con type=AspectJ

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 
import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration; 
import org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration; 
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.FilterType; 
import org.springframework.context.annotation.ImportResource; 

@SpringBootApplication 
@EnableAutoConfiguration 
@ComponentScan(basePackages = { "com.example" }, 
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "com.example.ignore.*")) 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 
+0

Questa è la risposta "moderna" corretta –

+0

Forse è puramente nostalgia, ma in realtà preferisco XML ancora – Kirby

+3

sii, ma con Spring 4.2 devo usare 'FilterType.REGEX' per questo approccio – ThanksForAllTheFish

3

Una cosa che sembra funzionare per me è questo:

@ComponentScan(basePackageClasses = {SomeTypeInYourPackage.class}, resourcePattern = "*.class") 

O in XML:

<context:component-scan base-package="com.example" resource-pattern="*.class"/> 

Questo sovrascrive quella di default resourcePattern che è "**/*.class" .

Questo sembrerebbe il modo più sicuro per contenere SOLO il tuo pacchetto base dal momento che resourcePattern sarebbe sempre lo stesso e relativamente al tuo pacchetto base.

9

Sembra che hai fatto questo attraverso XML, ma se si sta lavorando nel nuovo best practice di Primavera, la vostra configurazione sarebbe in Java, e si potrebbe escluderli come così:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "net.example.tool", 
    excludeFilters = {@ComponentScan.Filter(
    type = FilterType.ASSIGNABLE_TYPE, 
    value = {JPAConfiguration.class, SecurityConfig.class}) 
    }) 
+0

Anche se ti rendi conto che questa domanda ha più di 4 anni ed è stata richiesta specificamente per Spring 3.1, giusto? –

+1

@JonathanW Ma tuttavia, una risposta davvero utile per le persone che vengono a questa pagina da una ricerca su google – Stewart

11

Per Primavera 4 Io uso il seguente
(sto pubblicandolo come la domanda è di 4 anni e più persone usano Spring 4 rispetto a Spring 3.1):

@Configuration 
@ComponentScan(basePackages = "com.example", 
    excludeFilters = @Filter(type=FilterType.REGEX,pattern="com\\.example\\.ignore\\..*")) 
public class RootConfig { 
    // ... 
} 
2

È inoltre possibile utilizzare @SpringBootApplication, che secondo la documentazione primavera fa la stessa funzionalità i seguenti tre annotazioni: @Configuration, @EnableAutoConfiguration@ComponentScan in un'annotazione.

@SpringBootApplication(exclude= {Foo.class}) 
public class MySpringConfiguration {} 
Problemi correlati