2011-04-13 4 views
6

팩토리 객체를 통해 객체를 동적으로 생성하고 싶지만 종속성의 autowiring을 허용하기 위해 객체를 스프링 컨텍스트를 통해 만들어야합니다. 나는이 문제를 해결할 수있는 다른 방법이 많이 있다는 것을 알고 있습니다. 예를 들어 서비스 로케이터 패턴을 사용합니다. 그러나 가능하면이 방법으로하고 싶습니다. 내가의 라인을 따라 무언가를 공장 만들인스턴스 팩토리 메소드를 사용하여 프로토 타입 빈을 동적으로 생성하기

class OuterObject { 
    List<InnerObjectInterface> innerObjs; 
    ... 
} 
class InnerObject implements InnerObjectInterface{ 
    @Autowired 
    SomeDependency someDependency; 
    ... 
} 

:

내가 두 개체가 상상

을 :

class OuterObjectFactory { 
    private innerObject = new InnerObject(); 

    public OuterObject construct(params){ 
     OuterObject o = new OuterObject(); 
     List<InnerObjectInterface> inners = new ArrayList<InnerObjectInterface>(); 
     ... 
     for(some dynamic condition){ 
      ... 
      inners.add(createInnerObject()); 
      ... 
     } 
    } 
    public createInnerObject(){ 
     return innerObject; 
    } 
} 

내 스프링의 context.xml을 것 같이 보입니다

<bean id="outerObjectFactory" class="path.OuterObjectFactory" /> 
<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" /> 

그러나 이것은 작동하지 않습니다. 하나의 innerObject 만 만들어졌으며 scope = "prototype"인 것처럼 작동합니다. 나는 빈 정의에 범위 = "프로토 타입"을 추가하는 경우 :

<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" scope="prototype"/> 

을 그 다음 많은 innerObjects을 만들 것, 그러나 그들은 올바르게 배선되지 않습니다. 동료는 here이라는 문서에서 factory bean은 bean 초기화에만 사용된다는 것을 의미한다고 생각하지만 명확하지 않습니다.

누군가 내 이해를 명확히 할 수 있으면 좋겠다. 그리고 아마도 내가하고있는 것보다 배선으로 공장 패턴을 모델링하는 더 좋은 방법을 제안 할 수도있다.

감사합니다.

답변

2

당신이 말하는 것은 당신이 싱글 톤 (singleton) 한 팩토리를 가지고 있으며, 완전한 의존성 주입으로 매번 새로운 객체를 생성하기를 원한다는 것입니다. 그 일을하는 오래된 방법은 위에 링크 된 Method Injection이었습니다. 새로운 (틀림없이 깨끗한 방법) Scoped Proxy를 사용하는 것입니다. annotations 또는 regular config을 사용할 수 있지만 Bean 주위에 프록시 (예 : InnerObject)를 만드는 것이 좋습니다. 적으로 참조가 필요하면 Spring은 자동으로 적절한 종속성이 삽입 된 새로운 사본을 제공합니다.

+1

프로토 타입 빈에 대해서는 실제로 작동하지 않습니다. 그러나 그것은 문제를 해결하는 방법 주입으로 나를 이끌었습니다. - 깨끗하게는 아니지만 여전히 멋지게 해결합니다. 감사합니다 반죽 – idbentley