Comprendre l'implémentation de ImportSelector dans Spring Framework

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.

Étiquettes: Spring import-selector dependency-injection Configuration Java

Publié le 25 juin à 20h31