câblage automatique des types génériques

Câblage à ressort des types génériques

1. Vue d'ensemble

Dans ce tutoriel, nous allons voir comment injecter des beans Spring pargeneric parameters.

2. Génération automatique au printemps 3.2.

Spring prend en charge l'injection de types génériques depuis la version 3.2.

Supposons que nous ayons une classe abstraite appeléeVehicle and une sous-classe concrète de celle-ci appeléeCar:

public abstract class Vehicle {
    private String name;
    private String manufacturer;

    // ... getters, setters etc
}
public class Car extends Vehicle {
    private String engineType;

    // ... getters, setters etc
}

Supposons que nous voulions injecter une liste d'objets de typeVehicle dans une classe de gestionnaire:

@Autowired
private List vehicles;

Spring will autowire all the Vehicle instance beans into this list. Peu importe comment nous instancions ces beans via une configuration Java ou XML.

Nous pouvons également utiliser des qualificatifs pour obtenir uniquement des beans spécifiques de typeVehicle. Ensuite, nous créons@CarQualifier et l'annotons avec@Qualifier:

@Target({
  ElementType.FIELD,
  ElementType.METHOD,
  ElementType.TYPE,
  ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface CarQualifier {
}

Maintenant, nous pouvons utiliser cette annotation sur notre liste pour obtenir seulement quelquesVehicles spécifiques:

@Autowired
@CarQualifier
private List vehicles;

Dans ce cas, nous pouvons créer plusieurs beansVehicle mais Spring n'injectera que ceux avec@CarQualifier dans la liste ci-dessus:

public class CustomConfiguration {
    @Bean
    @CarQualifier
    public Car getMercedes() {
        return new Car("E280", "Mercedes", "Diesel");
    }
}

3. Générations automatiques au printemps 4.0.

Supposons que nous ayons une autre sous-classeVehicle appeléeMotorcycle:

public class Motorcycle extends Vehicle {
    private boolean twoWheeler;
    //... getters, setters etc
}

Maintenant, si nous voulons injecter uniquement les beansCar dans notre liste mais pas les sonsMotorcycle , nous pouvons le faire en utilisant la sous-classe spécifique comme paramètre de type:

@Autowired
private List vehicles;

Spring lets us use a generic type as a qualifier sans avoir besoin d'une annotation explicite depuis la version 4.0.

Avant Spring 4.0, le code ci-dessus ne fonctionnait pas avec les beans de plusieurs sous-classes deVehicle. Sans qualificatifs explicites, nous recevrions unNonUniqueBeanDefinitionException.

4. ResolvableType

La fonction de câblage automatique des génériques fonctionne avec l'aide de la classeResolvableType dans les coulisses.

Il a été introduit dans Spring 4.0 pour encapsuler Java Type et gérer l’accès aux supertypes, interfaces, paramètres génériques et enfin résoudre le problème en une classe:

ResolvableType vehiclesType = ResolvableType.forField(getClass().getDeclaredField("vehicles"));
System.out.println(vehiclesType);

ResolvableType type = vehiclesType.getGeneric();
System.out.println(type);

Class aClass = type.resolve();
System.out.println(aClass);

La sortie du code ci-dessus montrerait les types simples et génériques correspondants:

java.util.List
com.example.model.Vehicle
class com.example.model.Vehicle

5. Conclusion

L'injection de types génériques est une fonctionnalité puissante qui évite aux développeurs d'affecter des qualificatifs explicites, rendant le code plus propre et beaucoup plus compréhensible.

Comme toujours, le code peut être trouvéover on GitHub.