web-dev-qa-db-fra.com

Exclure les sous-packages de l'auto-câblage Spring?

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

Par exemple, si je voulais inclure une analyse de composant avec un package 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)

70
HolySamosa

Je ne suis pas sûr que vous puissiez exclure explicitement les paquets avec un <exclude-filter>, mais je parie que l'utilisation d'un filtre regex vous permettrait effectivement de vous y rendre:

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

Pour le rendre basé sur les annotations, annotez chaque classe à exclure des tests d'intégration avec quelque chose comme @ com.example.annotation.ExcludedFromITests. Ensuite, le composant-scan 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, car vous avez maintenant 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.

79
Jonathan W

J'utilise @ComponentScan comme suit pour le même cas d'utilisation. C'est la même chose que réponse de BenSchro1 XML mais cela 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);
    }
}
52
Kirby

Pour Spring 4 J'utilise ce qui suit
(Je la poste car la question a 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 {
    // ...
}
23
Witold Kaczurba

Cela semble avoir été fait via XML, mais si vous utilisiez la nouvelle meilleure pratique de Spring, votre configuration serait en Java et vous pourriez les exclure de la manière suivante:

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

Cela fonctionne au printemps 3.0.5. Donc, je penserais que cela fonctionnerait en 3.1

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

Je pense que vous devriez refactoriser vos paquets dans une hiérarchie plus pratique, afin qu'ils ne soient pas dans le paquet de base.

Mais si vous ne pouvez pas faire cela, essayez:

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

Ici vous pouvez trouver plus d'exemples: tilisation de filtres pour personnaliser l'analyse

6
richarbernal

Une chose qui semble fonctionner pour moi est la suivante:

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

Ou en XML:

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

Ceci remplace la valeur par défaut resourcePattern qui est "**/*.class".

Cela semblerait être le moyen le plus sûr en termes de typage d'inclure UNIQUEMENT votre paquet de base, car cet attribut resourcePattern serait toujours identique et relatif à votre paquet de base.

4
leeor

Vous pouvez également utiliser @ SpringBootApplication , qui, selon la documentation de Spring, offre les mêmes fonctionnalités que les trois annotations suivantes: @ Configuration , @ EnableAutoConfiguration @ ComponentScan dans une annotation.

@SpringBootApplication(exclude= {Foo.class})
public class MySpringConfiguration {}
2
dorony

Vous pouvez également inclure un paquet spécifique et les exclure comme:

inclure et exclure (les deux)

 @SpringBootApplication
        (
                scanBasePackages = {
                        "com.package1",
                        "com.package2"
                },
                exclude = {org.springframework.boot.sample.class}
        )

JUST Exclude

@SpringBootApplication(exclude= {com.package1.class})
public class MySpringConfiguration {}
0
Rishabh Agarwal