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)
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.
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);
}
}
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 {
// ...
}
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})
})
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>
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
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.
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 {}
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 {}