Dans une classe annotée avec @Configuration, l'annotation @Import permet d'importer d'autres configurations. Elle peut également inclure des implémentations de l'interface org.springframework.context.annotation.ImportSelector.
L'interfcae ImportSelector définit la méthode selectImports(), qui retourne un tableau de noms de classes à enregistrer en tant que beans dans le contexte Spring. Lorsqu'une classe @Configuration utilise @Import avec un ImportSelector, les classes spécifiées par cette méthode sont automatiqueemnt instanciées comme composants Spring.
Voici un exemple pratique illustrant cette mécanisme avec des noms modifiés :
Considérons une interface ServiceTraitement dont les implémentations ne possèdent pas d'annotatoins Spring standard.
package com.example.services;
public interface ServiceTraitement {
void executerOperation();
}
Première implémentation :
package com.example.services.impl;
import com.example.services.ServiceTraitement;
public class ServiceTraitementAlpha implements ServiceTraitement {
@Override
public void executerOperation() {
System.out.println("Exécution de l'opération Alpha");
}
}
Seconde implémentation :
package com.example.services.impl;
import com.example.services.ServiceTraitement;
public class ServiceTraitementBeta implements ServiceTraitement {
@Override
public void executerOperation() {
System.out.println("Exécution de l'opération Beta");
}
}
Création d'un sélecteur d'import personnalisé :
package com.example.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class SélecteurImportTraitement implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{
ServiceTraitementAlpha.class.getName(),
ServiceTraitementBeta.class.getName()
};
}
}
Définition de la classe de configuration qui utilise ce sélecteur :
package com.example.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(SélecteurImportTraitement.class)
public class ConfigurationTraitement {
}
Pour valider le fonctionnement, un contrôleur peut injecter une liste de tous les services disponibles :
@RestController
public class ContrôleurVérification {
@Autowired
private List<ServiceTraitement> servicesTraitement;
@GetMapping("/tester-import")
public void testerImport() {
servicesTraitement.forEach(service -> service.executerOperation());
}
}
Lors de l'appel à l'endpoint, la sortie console affichera successivement les messages des deux implémentations, confirmant leur enregistrement automatique par le sélecteur d'import.