2009-12-04 67 views
1

使用Spring,我可以得到使用此當前定義的某種類型的所有豆類:依類型使用泛型的依賴注入 - 它是如何工作的?

@Resource 
private List<Foo> allFoos; 

如何春季做到這一點?我認爲泛型的類型信息在運行時被刪除。那麼Spring如何知道列表的類型Foo,並且只注入正確類型的依賴關係?

舉例說明:我沒有包含其他bean的「List」類型的bean。相反,Spring會創建該列表並將所有正確類型的beans(Foo)添加到該列表中,然後注入該列表。

+0

1)類型的擦除發生在編譯時,*不*在運行時; 2)在字段和方法/構造函數參數聲明中指定的所有類型都由編譯器完全保留在字節碼中,並且在運行時通過Java Reflection API提供。所以,Spring通過從相應的java.lang.reflect.Field對象中獲取'allFoos'字段的元素類型來完成它。 – 2015-08-23 17:08:01

回答

5

並非所有的一般信息在運行時丟失:

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

} 

輸出:

class java.lang.String