2009-12-04 2 views
1

Spring을 사용하면 다음과 같이 현재 정의 된 특정 유형의 모든 빈을 얻을 수있다.제네릭을 사용하는 유형별 의존성 주입 - 어떻게 작동합니까?

@Resource 
private List<Foo> allFoos; 

Spring은 어떻게 하는가? 제네릭의 유형 정보가 런타임에 지워 졌다고 생각했습니다. 그렇다면 Spring은 목록의 유형 Foo에 대해 어떻게 알며 올바른 유형의 종속성 만 주입합니까?

설명 : 다른 bean이 들어있는 "List"유형의 bean이 없습니다. 대신, Spring은 그리스트를 생성하고 올바른 타입 (Foo)의 모든 빈을이리스트에 추가 한 다음 그리스트를 삽입한다.

+0

1) 삭제를 입력 컴파일 시간에 발생, *하지 * 런타임에; 2) 필드 및 메서드/생성자 매개 변수 선언에 지정된 모든 유형은 컴파일러에서 바이트 코드로 완벽하게 보존되며 런타임시 Java Reflection API를 통해 사용할 수 있습니다. 그래서 Spring은'java.lang.reflect.Field' 객체로부터'allFoos' 필드의 요소 타입을 얻음으로써 그것을 수행합니다. –

답변

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