2009-12-04 2 views
1

Использование Spring, я могу получить все бобы определенного типа, которые в настоящее время определяются с помощью этого:Зависимость Инъекция по типу с использованием дженериков - как это работает?

@Resource 
private List<Foo> allFoos; 

Как Spring сделать это? Я думал, что информация типа дженериков была стерта во время выполнения. Итак, как Spring знает о типе Foo списка и только вводит зависимости правильного типа?

Чтобы проиллюстрировать: у меня нет компонента типа «Список», который содержит другие бобы. Вместо этого Spring создает этот список и добавляет в этот список все бобы нужного типа (Foo), а затем вводит этот список.

+0

1) Тип стирания происходит во время компиляции, * не * во время выполнения; 2) все типы, указанные в объявлениях параметров поля и метода/конструктора, полностью сохраняются в байт-кодере компилятором и доступны во время выполнения через API Java Reflection. Таким образом, Spring делает это путем получения типа элемента поля allFoos из соответствующего объекта 'java.lang.reflect.Field'. –

ответ

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 
Смежные вопросы