2010-04-12 5 views
0

산타가 목록을 가지고 있습니다. 그는 히트리스트에있는 모든 어린이들에게 "선물"을 만들어주고 싶습니다. (우리는 그들이 모두 좋다고 생각하고 있습니다.) 썰매에 모든 것을 적재하십시오. 그는 봄과 함께 할 수 있습니까?Spring FactoryBean - "객체 생성"목록을 반복합니다.

나는 FactoryBean을 구현하고 주어진 파일의 줄을 나타내는 문자열 목록을 반환하는 간단한 FileListFactory를 작성했다. 지금 당장 그 값을 설정하십시오. <리스트의 문제를 해결하면이 팩터 리의 출력을 대신 연결할 수 있다고 가정합니다.

무엇이 내가 을 원한다면은 "foo"개체의 목록입니다. foo 객체는 일부 bean의 singleton이 아닌 인스턴스입니다 (추상 bean 정의가있을 가능성이 있음). 생성 된 각 foo 객체는 목록 항목 중 하나를 속성으로 가져옵니다.

한 레벨 더 올리려면 해당 속성은 "막대"개체입니다. 문자열에서 "bar"객체를 만들기위한 속성 편집기를 이미 만들었습니다. 따라서 문자열 목록을 반복하는 것은 인스턴스 별 속성을 설정할 때 속성 편집기 인프라를 사용해야합니다.

리스트 팩토리 반복자 빈 (bean) 또는 이와 같은 것이 있어야하는 것처럼 보입니다. 문제는 "list"와 같은 용어가 너무 일반적이기 때문에이 문제에 대한 예제 솔루션을 찾기 위해 수행하는 모든 검색이 실패하는 것 같습니다.

답변

0

나는 결코 돌아 오지 않았고 내가 감은 것을 문서화하지 않았다.

마법은리스트를 반복하는 팩토리 객체가 추상이라는 것입니다. 그것은 "foo"의 인스턴스를 반환하는 추상 메소드를 가지고 있습니다. 추상 클래스되고, 당신은 봄의 XML 설정에서의 구체적인 인스턴스를 생성 그럼에도 불구하고

public abstract Foo createFoo(); 

하지만,이처럼 보이는 XML에서 별도의 자식 노드 :

<bean id="Santa" class="..."> 
    <lookup-method name="createFoo" bean="fooFactory"/> 
    ... 
</bean> 
이 경우

"fooFactory"빈은 Foo 객체를 판매하는 팩토리입니다.

결과적으로 Spring IoC의 마법을 통해 익숙한 객체가 얻어진다. 익명 객체는 팩토리 빈을 참조하는 추상 메소드의 구현을 포함하는 추상 클래스의 구체적인 인스턴스이다.

산타 클래스 코드는 목록을 가져 와서 반복하고 createFoo()를 호출하여 Foo를 가져온 다음 Foo.setBar()를 적절하게 호출합니다.

장난 꾸러기!

0

정확하게 이해했다면 문자열 목록을 볼 수 있습니다 (예 : 파일에서 읽음). 이 문자열 각각에 대해 적절한 문자열로 "bar"속성에 할당 된 "foo"객체를 만들고 싶습니다.

BeanFactoryPostProcessor을 구현하면이 문제를 해결할 수 있습니다. 각 문자열에 대해 새 BeanDefinition을 작성하고 대상 팩토리에 등록하십시오. 간단하게하려면 ChildBeanDefinition을 만들고 등록하고 "일반"bean의 이름을 모든 일반 구성으로 제공하고 "bar"속성 만 설정하십시오.

+0

당신은 문제 문이 올바른있어,하지만 당신이 그렇게 어떻게 "문자열의 각각에 대해 새하는 BeanDefinition을 만들어?" – nsayer

+0

새 ChildBeanDefinition ("myAbstractParentBean") BeanDefinition, BeanDefinitionRegistry 및 구현을 참조하십시오. – lexicore

+0

아, 알겠습니다. BFPP는 목록을 속성으로 사용하여 코드에서이 작업을 수행합니다. 나는이 문제를 해결하기 위해 유사한 것을하고 있지만 보통 콩으로 감았습니다. 특수한 "FooListCreator"에 연결된 막대 목록 개체가 있습니다. 그 거시기는 BeanFactoryAware이고 목록의 각 "바"에 대해 "foo"의 인스턴스를 묻는 다음 바 속성을 프로그래밍 방식으로 설정합니다. 나는 더 많은 것들이 실제 자바 코드없이 가능하다는 것을 기대했다. 즉, 애플리케이션 컨텍스트 xml 파일 자체에있다. – nsayer

관련 문제