95 votes

Exclure les sous-packages du câblage automatique de Spring ?

Existe-t-il un moyen simple d'exclure un paquet / sous-paquet du câblage automatique dans Spring 3.1 ?

Par exemple, si je voulais inclure un scan de composants avec un paquet de base de com.example existe-t-il un moyen simple d'exclure com.example.ignore ?

(Pourquoi ? Je voudrais exclure certains composants de mes tests d'intégration)

92voto

Jonathan W Points 1934

Je ne suis pas sûr que vous puissiez exclure des paquets explicitement avec un <filtre d'exclusion>, mais je parie que l'utilisation d'un filtre regex vous permettrait d'y parvenir efficacement :

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

Pour le rendre basé sur des annotations, vous annoteriez chaque classe que vous voulez exclure des tests d'intégration avec quelque chose comme @com.example.annotation.ExcludedFromITests. Ensuite, l'analyse des composants ressemblerait à ceci :

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

C'est plus clair parce que maintenant vous avez documenté dans le code source lui-même que la classe n'est pas destinée à être incluse dans un contexte d'application pour les tests d'intégration.

62voto

Kirby Points 1149

J'utilise @ComponentScan comme suit pour le même cas d'utilisation. C'est la même chose que BenSchro10's Réponse XML mais qui utilise des annotations. Les deux utilisent un filtre avec 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);
    }
}

46voto

Witold Kaczurba Points 2815

Para Printemps 4 J'utilise les éléments suivants
(Je le poste car la question date de 4 ans et plus de personnes utilisent Spring 4 que Spring 3.1) :

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

17voto

Arsalan Khalid Points 167

Il semble que vous l'ayez fait par le biais de XML, mais si vous travailliez selon les nouvelles pratiques de Spring, votre configuration serait en Java, et vous pourriez les exclure ainsi :

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

12voto

BenSchro10 Points 246

Cela fonctionne dans Spring 3.0.5. Donc, je pense que cela devrait fonctionner en 3.1.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X