1. Обзор
В этом уроке мы увидим, как вводить весенние бобы по общим параметрам .
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 Listvehicles;
Spring автоматически подключит все бобы Vehicle экземпляра в этот список. Не имеет значения, как мы создаем экземпляры этих компонентов с помощью конфигурации Java или XML.
Мы также можем использовать квалификаторы, чтобы получить только определенные бобы типа Vehicle . Затем мы создаем @CarQualifier и аннотируем его с помощью @Qualifier :
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface CarQualifier { }
Теперь мы можем использовать эту аннотацию в нашем списке, чтобы получить только некоторые конкретные Транспортные средства :
@Autowired @CarQualifier private Listvehicles;
В этом случае мы можем создать несколько Транспортное средство бобы, но весна будет вводить только те, с @CarQualifier в список выше:
public class CustomConfiguration { @Bean @CarQualifier public Car getMercedes() { return new Car("E280", "Mercedes", "Diesel"); } }
3. Генераторы автопроводки весной 4.0.
Предположим,у нас есть другой Транспортное средство подкласс под названием Мотоцикл :
public class Motorcycle extends Vehicle { private boolean twoWheeler; //... getters, setters etc }
Теперь, если мы хотим ввести в наш список только Car beans, но не Motorcycle , мы можем сделать это, используя конкретный подкласс в качестве параметра типа:
@Autowired private Listvehicles;
Spring позволяет нам использовать универсальный тип в качестве квалификатора без необходимости явной аннотации начиная с версии 4.0.
До Spring 4.0 приведенный выше код не работал бы с бобами нескольких подклассов Vehicle . Без явных квалификаторов мы получили бы исключение Nouniquebeandefinitionexception .
4. Тип разрешения
Функция автоматического подключения дженериков работает с помощью Тип разрешения класс за кулисами.
Он был введен в Spring 4.0 для инкапсуляции типа Java и обработки доступа к супертипам, интерфейсам, общим параметрам и, наконец, для разрешения класса:
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.Listcom.example.model.Vehicle class com.example.model.Vehicle
5. Заключение
Внедрение универсальных типов-это мощная функция, которая экономит разработчику усилия по назначению явных квалификаторов, делая код более чистым и понятным.
Как всегда, код можно найти на GitHub .