web-dev-qa-db-fra.com

Comment analyser plusieurs chemins à l'aide de l'annotation @ComponentScan?

J'utilise Spring 3.1 et je lance une application en utilisant les attributs @Configuration et @ComponentScan.

Le démarrage effectif se fait avec

new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);

Cette classe de configuration est annotée avec

@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass

et cela fonctionne bien. Cependant, j'aimerais être plus précis sur les paquets que j'ai scannés, alors j'ai essayé.

@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass

Cependant, cela échoue et des erreurs me disent qu'il ne trouve pas les composants spécifiés à l'aide de l'annotation @Component.

Quelle est la bonne façon de faire ce que je recherche?

Merci

69
Peter Wilkinson

@ComponentScan utilise un tableau de chaînes, comme ceci:

@ComponentScan({"com.my.package.first","com.my.package.second"})

Lorsque vous fournissez plusieurs noms de package dans une seule chaîne, Spring l'interprète comme un nom de package et ne peut donc pas le trouver.

123
hage

Il existe un autre type-safe _ ​​alternative pour spécifier un emplacement de package de base en tant que chaîne. Voir l'API ici , mais j'ai aussi illustré ci-dessous:

@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})

L'utilisation du spécificateur basePackageClasses avec vos références de classe indiquera à Spring d'analyser ces packages (tout comme le alternatives mentionné), mais cette méthode est à la fois type-safe et ajoute IDE prend en charge pour la refactorisation future - un énorme avantage dans mon livre.

Relevant de l'API, Spring suggère de créer dans chaque package que vous souhaitez analyser une classe ou une interface de marqueur no-op, qui ne sert à rien d'autre que d'être utilisé comme référence pour/par cet attribut.

IMO, je n'aime pas les classes de marqueur (mais encore une fois, elles ressemblent beaucoup aux classes de paquet-info)} mais le type safety, le support de IDE, et la réduction drastique du Le nombre de paquets de base à inclure pour cette analyse est sans aucun doute une bien meilleure option.

37
Prancer

Indiquez votre nom de paquet séparément, il nécessite un String[] pour les noms de paquet.

Au lieu de cela:

@ComponentScan("com.my.package.first,com.my.package.second")

Utilisez ceci:

@ComponentScan({"com.my.package.first","com.my.package.second"})
17
mprabhat

Une autre façon de faire consiste à utiliser le champ basePackages; qui est un champ dans l'annotation ComponentScan.

@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})

Si vous examinez l'annotation ComponentScan .class à partir du fichier jar, vous verrez un champ basePackages contenant un tableau de chaînes

public @interface ComponentScan {
String[] basePackages() default {};
}
9
shashwatZing

Vous pouvez également utiliser l'annotation @ComponentScans:

@ComponentScans(value = { @ComponentScan("com.my.package.first"),
                          @ComponentScan("com.my.package.second") })
0
Farouk.ch

assurez-vous d'avoir ajouté cette dépendance dans votre pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
0
Amirtha Krishnan