2012-03-05 1 views
1

여기 상황은 동적 구현이있는 인터페이스가 있다는 것입니다. 이러한 구현은 런타임에 인스턴스화되어야하고 인터페이스를 주입하여 사용해야합니다.스프링에서 참조 된 종속성 구현을 어떻게 동적으로 생성합니까?

public interface Configuration { 
    void doStuff(); 
} 

public interface ExampleConfiguration extends Configuration { 
    void doStuff(); 
} 

ExampleConfiguration에는 동적으로 생성 된 구현이 있습니다. 즉, ExampleConfigurationImpl 클래스가 없습니다. 나는 자동으로 주입이 생성 구현을 갖고 싶어하기 때문에 봄에 통합하기 어려운 증명 :

@Autowired 
private ExampleConfiguration config; 

가 나는 BeanPostProcessor를 추가하는 길을 갔다하지만 해결되지 않은 종속성이 통과하지 않는 것처럼 나는대로 (보이는 기대할 것이다).

기본적으로 누락 된 종속성을 해결하기 위해 (DependencyDescriptor 인스턴스와 같은 상황 정보와 함께) 호출 될 팩토리를 제공하는 방법이 있습니까? Configuration 인터페이스를 확장하는 여러 개의 인터페이스가 있습니다.

봄 버전은 3.0.3입니다.

답변

2

FactoryBean을 사용해 보셨습니까?

public class ExampleConfigurationFactoryBean implements FactoryBean<ExampleConfiguration> { 
    @Override 
    public ExampleConfiguration getObject() throws Exception { 
     return //...magic here 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return ExampleConfiguration.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 
} 

나는 (내가 관여되는 몇 가지 동적 프록시를 의심) 당신이 실제로 이러한 동적 콩을 만드는 방법을 알고 있지만, 여기 마법 자리에 로직을 삽입하지 마십시오. 일해야한다.

<bean id="exampleConfigurationFactoryBean" class="ExampleConfigurationFactoryBean"/> 
<bean id="someBean"> 
    <!-- exampleConfiguration is of ExampleConfiguration type --> 
    <property name="exampleConfiguration" ref="exampleConfigurationFactoryBean"/> 
</bean> 

봄 요청시 getObject()를 호출합니다 : 그것은 당신의 XML의 대상 유형을 가진 것처럼 당신은 FactoryBean를 사용합니다.

+0

+1/2 - 'applicationContext.xml'에 필요한 XML을 보여 주어 factory bean을 설정하고 참조 할 수 있습니까? –

+0

@DavidHarkness : 내 업데이트를 확인하십시오. –

+0

그래서 저는 factory bean 접근 방식을 사용했습니다. 그러나 문제는 Configuration을 확장하는 인터페이스가 여러 가지 경우라는 것입니다. Configuration의 모든 확장을위한 factory bean이 필요할 것이다. – Zack

1

인스턴스를 실제로 제작할 수있는 방법이 있다고 생각합니까? 글쎄, 당신이해야 할 모든 권리 주석을 빈 자체에 그 공장을 만들고 추가하는 것입니다

@org.springframework.context.annotation.Configuration 
public class ConfigBean { 
    @org.springframework.context.annotation.Bean 
    public ExampleConfiguration getObject() throws Exception { 
     return //...magic here 
    } 
} 

당신은 당신이 필요로하는 모든 구성에 접선에 대한 일반적인 스프링 기술을 사용합니다. (나는 당신이 <context:component-scan><context:annotation-config>을 사용하고 있다고 가정한다.)

+0

이 접근법의 유일한 문제점은 기본 인터페이스의 모든 구현에 대해 새로운 메소드를 작성해야한다는 것입니다. – Zack

관련 문제