Весенняя автопроводка универсальных типов
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.