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
@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.
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.
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"})
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 {};
}
Vous pouvez également utiliser l'annotation @ComponentScans:
@ComponentScans(value = { @ComponentScan("com.my.package.first"),
@ComponentScan("com.my.package.second") })
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>