Рубрики
Без рубрики

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

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

Автор оригинала: baeldung.

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 List vehicles;

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 List vehicles;

В этом случае мы можем создать несколько Транспортное средство бобы, но весна будет вводить только те, с @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 List vehicles;

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.List
com.example.model.Vehicle
class com.example.model.Vehicle

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

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

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