문제

봄에 유형의 모든 콩과 하위 유형으로 목록을 자동 채울 수있는 방법이 있습니까? 나는 다음과 같은 것처럼 보이는 세터 방법이 있습니다.

setMyProp(List<MyType> list)

그리고 나는 myType의 콩과 myType의 모든 서브 클래스에서 Autowire를 원합니다.

감사합니다, 제프

도움이 되었습니까?

해결책

그래, 당신은 이것을 할 수 있습니다. 봄 문서는 다음과 같이 말합니다.

해당 유형의 배열을 기대하는 필드 또는 메소드에 주석을 추가하여 ApplicationContext의 특정 유형의 모든 Bean을 제공 할 수도 있습니다.

목록이 아닌 배열을 기대해야한다고 말합니다. 일반적인 유형 삭제는 런타임에 목록이 작동하지 않을 수 있기 때문에 이것은 의미가 있습니다. 그러나 다음과 같은 단위 테스트를 수행하십시오.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  

    <bean class="test.Test.TypeB"/>
    <bean class="test.Test.TypeC"/>
    <bean class="test.Test.TypeD"/>
</beans>

그리고이 단원 테스트 :

package test;

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class Test {

    private @Autowired List<TypeA> beans;

    @org.junit.Test
    public void test() {
        assertNotNull(beans);
        assertEquals(2, beans.size());
        for (TypeA bean : beans) {
            assertTrue(bean instanceof TypeA);
        }
    }       

    public static interface TypeA {}
    public static class TypeB implements TypeA {}
    public static class TypeC extends TypeB {}
    public static class TypeD {}

}

그래서 공식적으로, 당신은 자동으로 가야합니다 TypeA[], 아니다 List<TypeA>, 그러나 목록은 잘 작동합니다.

다른 팁

BEAN 정의 파일 내에 있지 않고 응용 프로그램 코드에서 목록을 작성하는 것이 허용되는 경우 org.springframework.beans.factory.xml.XmlBeanFactory 그리고 물어보세요 "getBeansOfType( MyType.class )". 이것은 당신에게 모든 유형 (및 하위 유형)의 콩을 제공합니다. MyType.

사용할 수있는 경우 @Autowired 채워질 코드 내부에서 Skaffman이 언급 한 방식을 안전하게 사용할 수 있습니다. XML 구성을 고집하면 작은 라이브러리가 있습니다. 헤라 이것을 달성하기 위해. 귀하가 설명하는 시나리오의 본질적으로 다음과 같이 보입니다.

<bean id="client" class="..">
    <property name="injectDynamicListHere">
        <hera:list class="my.custom.SuperType" />
    </property>
</bean>

이렇게하면 모든 최상위 스프링 빈이 구현됩니다 SuperType ~처럼 List 클라이언트 콩으로.

짧은 대답 : 아니요.

긴 답변 : Java Generics는 유형 Erasure에 따라 작동합니다. 즉, 런타임에서 그 매개 변수는 단순히 제네릭 유형의 목록이 아니라 단순히 목록이라는 것을 의미합니다. 따라서 당신은 그것이 매개 변수 유형 mytype이라는 것을 알 수 없으므로이 동작을 구현할 수는 없습니다.

즉,이 작업을 수행하는 대안적인 방법이 있습니다. 가장 분명한 것은 Bean Creation을 듣고 MyType (또는 서브 클래스)인지 확인한 다음 참조를 유지하는 것 같습니다.

아마도 이것을하는 몇 가지 방법이있을 것입니다. 하나는 Bean Post-Processor 만들기. 이렇게하면 생성 된 모든 콩을 알게 될 것입니다.

레거시 코드와 @autowired 누락으로 인해 다음과 같이 해결합니다.

MyBean implements ApplicationContextAware{

  @Override
  public void setApplicationContext(ApplicationContext ctx) throws BeansException {
    final Map<String, HttpRequestHandlerTemplate> beansOfType = ctx.getBeansOfType(RequiredBean.class);
    ...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top