101 votes

Comment scanner plusieurs chemins en utilisant l'annotation @ComponentScan ?

J'utilise Spring 3.1 et je démarre une application à l'aide de la fonction @Configuration y @ComponentScan attributs.

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 spécifique quant aux paquets que je scanne, alors j'ai essayé.

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

Cependant, cela échoue avec des erreurs m'indiquant qu'il ne peut pas trouver les composants spécifiés à l'aide de la fonction @Component annotation.

Quelle est la manière correcte de faire ce que je cherche ?

Merci

180voto

hage Points 2626

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

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

Lorsque vous fournissez plusieurs noms de paquets dans une seule chaîne, Spring interprète cela comme un seul nom de paquet, et ne peut donc pas le trouver.

51voto

Prancer Points 163

Il y a un autre Sûreté de fonctionnement alternative pour spécifier l'emplacement d'un paquet de base comme une chaîne. Voir l'API ici mais je l'ai également illustré ci-dessous :

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

Utilisation de la BasePackageClasses avec vos références de classe indiquera à Spring qu'il doit analyser ces paquets (tout comme la méthode mentionnée ci-dessus). alternatives ), mais cette méthode est à la fois Sûreté de fonctionnement et ajoute Support IDE en vue d'un remaniement futur, ce qui constitue un avantage considérable à mes yeux.

À la lecture de l'API, Spring suggère de créer une classe ou une interface de marquage no-op dans chaque paquet que vous souhaitez analyser et qui n'a d'autre but que d'être utilisée comme référence pour/par cet attribut.

IMO, je n'aime pas les classes de marqueurs. (mais là encore, elles sont à peu près comme les classes de package-info) mais la sécurité des types, le support IDE, et la réduction drastique du nombre de paquets de base à inclure pour cette analyse est, sans aucun doute, une bien meilleure option.

20voto

mprabhat Points 11553

Fournissez votre nom de paquet séparément, il nécessite un [String[]](http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/ComponentScan.html#basePackages()) pour les noms de paquets.

Au lieu de ça :

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

Utilisez ça :

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

12voto

shashwatZing Points 911

Une autre façon de procéder consiste à utiliser l'option basePackages qui est un champ de l'annotation ComponentScan.

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

Si vous regardez dans l'annotation ComponentScan .class du fichier jar, vous verrez un champ basePackages qui prend un tableau de chaînes de caractères.

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

Ou vous pouvez mentionner les classes explicitement. Qui prend un tableau de classes

Class<?>[]  basePackageClasses

5voto

ksw Points 53

Vous utilisez ComponentScan pour analyser plusieurs paquets à l'aide de

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

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