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)

7voto

richarbernal Points 739

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

Mais si vous ne pouvez pas le faire, essayez :

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

Vous trouverez ici d'autres exemples : Utilisation de filtres pour personnaliser l'analyse

4voto

leeor Points 346

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"/>

Cette option remplace l'option par défaut resourcePattern qui est "**/*.class" .

Cela semble être le moyen le plus sûr d'inclure UNIQUEMENT votre paquet de base puisque le modèle de ressource sera toujours le même et relatif à votre paquet de base.

2voto

dorony Points 363

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

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

0voto

Rishabh Agarwal Points 165

Vous pouvez également inclure des paquets spécifiques et les exclure comme :

Inclure et exclure (les deux)

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

Exclure JUST

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

0voto

dkb Points 2062

Juste un ajout aux réponses existantes.
Si vous souhaitez exclure des classes des sous-paquets mais pas du paquet de base, vous pouvez modifier les paramètres suivants "com.example.ignore.* a "com.example.ignore.*..*" comme suit

Vérifié dans spring-boot : 2.4.1

Extrait de code de este réponse

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);
    }
}

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