Внедрение зависимостей по типу с использованием обобщений - как это работает? - PullRequest
1 голос
/ 04 декабря 2009

Используя Spring, я могу получить все bean-компоненты определенного типа, которые в настоящее время определены, используя это:

@Resource
private List<Foo> allFoos;

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

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

1 Ответ

5 голосов
/ 04 декабря 2009

Не вся общая информация теряется во время выполнения:

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
...