Auto-Einstellung für generische Typen

Spring Autowiring von generischen Typen

1. Überblick

In diesem Tutorial erfahren Sie, wie Sie Spring Beans umgeneric parameters injizieren.

2. Autowiring-Generika im Frühjahr 3.2.

Spring unterstützt die Injektion generischer Typen seit Version 3.2.

Angenommen, wir haben eine abstrakte Klasse namensVehicle und eine konkrete Unterklasse davon namensCar:

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

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

    // ... getters, setters etc
}

Angenommen, wir möchten eine Liste von Objekten vom TypVehicle in eine Handlerklasse einfügen:

@Autowired
private List vehicles;

Spring will autowire all the Vehicle instance beans into this list. Es spielt keine Rolle, wie wir diese Beans durch Java- oder XML-Konfiguration instanziieren.

Wir können auch Qualifizierer verwenden, um nur bestimmte Beans vom TypVehiclezu erhalten. Dann erstellen wir@CarQualifier und kommentieren es mit@Qualifier:

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

Jetzt können wir diese Anmerkung in unserer Liste verwenden, um nur einige bestimmteVehicles zu erhalten:

@Autowired
@CarQualifier
private List vehicles;

In diesem Fall können wir mehrereVehicle-Bohnen erstellen, aber Spring fügt nur diejenigen mit@CarQualifier in die obige Liste ein:

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

3. Autowiring-Generika im Frühjahr 4.0.

Angenommen, wir haben eine andereVehicle-Unterklasse namensMotorcycle:

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

Wenn wir nun nur dieCar-Beans in unsere Liste einfügen möchten, aber keineMotorcycle -Sones, können wir dies tun, indem wir die spezifische Unterklasse als Typparameter verwenden:

@Autowired
private List vehicles;

Spring lets us use a generic type as a qualifier ohne explizite Anmerkung seit Version 4.0.

Vor Spring 4.0 würde der obige Code nicht mit Beans mehrerer Unterklassen vonVehicle. funktionieren. Ohne explizite Qualifizierer würden wirNonUniqueBeanDefinitionException erhalten.

4. ResolvableType

Die generische Autowiring-Funktion funktioniert mit Hilfe derResolvableType-Klasse hinter den Kulissen.

Es wurde in Spring 4.0 eingeführt, um Java Type zu kapseln und den Zugriff auf Supertypen, Interfaces, generische Parameter und schließlich die Auflösung in eine Klasse zu verwalten:

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);

Die Ausgabe des obigen Codes würde die entsprechenden einfachen und generischen Typen anzeigen:

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

5. Fazit

Das Einfügen von generischen Typen ist eine leistungsstarke Funktion, die dem Entwickler die Zuordnung expliziter Qualifikationsmerkmale erspart und den Code übersichtlicher und verständlicher macht.

Wie immer kann der Codeover on GitHub gefunden werden.