Fiação automática de mola de tipos genéricos

Fiação automática de mola de tipos genéricos

1. Visão geral

Neste tutorial, veremos como injetar beans Spring porgeneric parameters.

2. Genéricos de ligação automática na primavera 3.2.

Spring suporta injeção de tipos genéricos desde a versão 3.2.

Suponha que temos uma classe abstrata chamadaVehicle lixar uma subclasse concreta dela chamadaCar:

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

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

    // ... getters, setters etc
}

Suponha que desejamos injetar uma lista de objetos do tipoVehicle em alguma classe de manipulador:

@Autowired
private List vehicles;

Spring will autowire all the Vehicle instance beans into this list. Não importa como instanciamos esses beans por meio da configuração Java ou XML.

Também podemos usar qualificadores para obter apenas beans específicos do tipoVehicle. Em seguida, criamos@CarQualifiere anotamos com@Qualifier:

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

Agora podemos usar esta anotação em nossa lista para obter apenas algunsVehicles específicos:

@Autowired
@CarQualifier
private List vehicles;

Nesse caso, podemos criar vários beansVehicle, mas o Spring só injetará aqueles com@CarQualifier na lista acima:

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

3. Genéricos de ligação automática no Spring 4.0.

Suponha que temos outra subclasseVehicle chamadaMotorcycle:

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

Agora, se quisermos injetar apenas os grãosCar em nossa lista, mas nenhumMotorcycle ones, podemos fazer isso usando a subclasse específica como um parâmetro de tipo:

@Autowired
private List vehicles;

Spring lets us use a generic type as a qualifier sem a necessidade de uma anotação explícita desde a versão 4.0.

Antes do Spring 4.0, o código acima não funcionava com beans de várias subclasses deVehicle. Sem qualificadores explícitos, receberíamos umNonUniqueBeanDefinitionException.

4. ResolvableType

O recurso de autowiring de genéricos funciona com a ajuda da classeResolvableType nos bastidores.

Foi introduzido no Spring 4.0 para encapsular o Java Type e manipular o acesso a supertipos, interfaces, parâmetros genéricos e finalmente resolver a classe:

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

A saída do código acima mostraria os tipos simples e genéricos correspondentes:

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

5. Conclusão

A injeção de tipos genéricos é um recurso poderoso, que poupa o desenvolvedor de atribuir qualificadores explícitos, tornando o código mais limpo e muito mais compreensível.

Como sempre, o código pode ser encontradoover on GitHub.