2009-12-04 6 views
1

avec Spring, je peux obtenir tous les haricots d'un certain type qui sont actuellement définies en utilisant ceci:Dépendance Injection par type utilisant des génériques - comment ça marche?

@Resource 
private List<Foo> allFoos; 

Comment Spring faire cela? Je pensais que les informations de type génériques étaient effacées lors de l'exécution. Alors, comment Spring connaît-il le type Foo de la liste et n'injecte que les dépendances du type correct? Par exemple: Je n'ai pas de bean de type "List" qui contient les autres beans. Au lieu de cela, Spring crée cette liste et ajoute tous les beans du type correct (Foo) à cette liste, puis injecte cette liste.

+0

1) de type effacement se produit à la compilation, * pas * lors de l'exécution; 2) tous les types spécifiés dans les déclarations de paramètres champ et méthode/constructeur sont entièrement conservés dans le bytecode par le compilateur et sont disponibles au moment de l'exécution via l'API Java Reflection. Ainsi, Spring le fait en obtenant le type d'élément du champ 'allFoos' de l'objet' java.lang.reflect.Field' correspondant. –

Répondre

5

Toutes les informations génériques est perdue lors de l'exécution:

import java.lang.reflect.Field; 
import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 
import java.util.List; 

public class Main { 

    public static List<String> list; 

    public static void main(String[] args) throws Exception { 
     Field field = Main.class.getField("list"); 
     Type type = field.getGenericType(); 

     if (type instanceof ParameterizedType) { 
      ParameterizedType pType = (ParameterizedType) type; 
      Type[] types = pType.getActualTypeArguments(); 
      for (Type t : types) { 
       System.out.println(t); 
      } 
     } else { 
      System.err.println("not parameterized"); 
     } 
    } 

} 

Sortie:

class java.lang.String