Весенняя автопроводка общих типов

Весенняя автопроводка универсальных типов

1. обзор

В этом руководстве мы увидим, как внедрить bean-компоненты Spring с помощьюgeneric parameters.

2. Дженерики автопроводки весной 3.2.

Spring поддерживает внедрение универсальных типов начиная с версии 3.2.

Предположим, у нас есть абстрактный классVehicle и его конкретный подклассCar:

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

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

    // ... getters, setters etc
}

Предположим, мы хотим внедрить список объектов типаVehicle в некоторый класс обработчика:

@Autowired
private List vehicles;

Spring will autowire all the Vehicle instance beans into this list. Не имеет значения, как мы создаем эти bean-компоненты через конфигурацию Java или XML.

Мы также можем использовать квалификаторы для получения только определенных bean-компонентов типаVehicle. Затем мы создаем@CarQualifier и аннотируем его@Qualifier:

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

Теперь мы можем использовать эту аннотацию в нашем списке, чтобы получить только некоторые конкретныеVehicles:

@Autowired
@CarQualifier
private List vehicles;

В этом случае мы можем создать несколько bean-компонентовVehicle, но Spring добавит только те, которые имеют@CarQualifier, в список выше:

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

3. Дженерик по автонтажу весной 4.0.

Предположим, у нас есть еще один подклассVehicle, называемыйMotorcycle:

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

Теперь, если мы хотим добавить в наш список только bean-компонентыCar, но неMotorcycle ones, мы можем сделать это, используя конкретный подкласс в качестве параметра типа:

@Autowired
private List vehicles;

Spring lets us use a generic type as a qualifier без необходимости явной аннотации, начиная с версии 4.0.

До Spring 4.0 приведенный выше код не работал с bean-компонентами нескольких подклассовVehicle.. Без явных квалификаторов мы получили быNonUniqueBeanDefinitionException.

4. ResolvableTypeс

Функция автоматического подключения generics работает с помощью классаResolvableType за кулисами.

Он был представлен в Spring 4.0 для инкапсуляции Java Type и обработки доступа к супертипам, интерфейсам, универсальным параметрам и, наконец, к классу:

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

Вывод приведенного выше кода будет показывать соответствующие простые и универсальные типы:

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

5. Заключение

Инъекция универсальных типов - это мощная функция, которая избавляет разработчика от необходимости назначать явные квалификаторы, делая код чище и намного более понятным.

Как всегда можно найти кодover on GitHub.