2013-03-20 2 views
1

종속성 주입을 위해 Spring에서 Guice로 마이그레이션하려고합니다. 내가 구글 Guice와 MyConnectionFactory을 매개 변수화하는 방법을 알아내는 고민하고Google Guice - 타사 라이브러리에 매개 변수를 전달하는 방법 공장 클래스

<bean id="connectionFactory" class="org.somethirdparty.MyConnectionFactory"> 
    <property name="connectionUrl" value="${urls.connectionUrl}"/> 
    <property name="ackMode" value="unordered"/> 
    <property name="timeout" ref="timeoutBean"/> 
</bean> 

<bean id="timeoutBean" class="java.lang.Integer"> 
    <constructor-arg value="10000"/> 
</bean> 

: 여기에 봄의 XML 설정의 샘플 조각입니다. 타사 라이브러리에서 제공하는 클래스이므로 'MyConnectionFactory'의 생성자 또는 메서드에 주석을 달 수 없습니다.

Guice FAQ을 읽은 후 나에게 유일한 옵션은 공장 용 공장을 만드는 것입니다. 그건 나에게 어리석은 것처럼 보인다!

+0

이 질문이 아직 주어지지 않았습니까? : –

답변

2

런타임시 MyConnectionFactory에 전달 된 매개 변수를 실제로 변경해야하는 경우에만 MyConnectionFactory에 대한 팩터 리를 만들어야 할 수 있습니다. 그렇지 않으면 결국 Provider을 공장으로 만드는 것만으로 도망 갈 수 있습니다. 또는 더 얇은 사촌 the @Provides Method. (I는 불특정 또는 원시적 인수를 문제의 클래스를 걸립니다 같은데요, 또는 그 밖에 toConstructor binding 또 다른 가능성이다.)

팩토리는 다음과 같이 보일 것이다 :

public class MyConnectionFactoryFactory { 
    @Inject Provider<SomeDependency> someDependencyProvider; 

    public MyConnectionFactory create(String url) { 
    return new MyConnectionFactory(someDependencyProvider.get(), url, 10000); 
    } 
} 

공급자가 동일 보일 것 제외 Provider<MyConnectionFactory>create을 구현하는 대신 0-arg get()이됩니다. 이것을 bind(MyConnectionFactory.class).toProvider(MyConnectionFactoryProvider.class)을 통해 바인딩 할 수 있습니다.

public class MyModule extends AbstractModule { 
    @Override public void configure() { /* your configuration here */ } 

    /* FYI: a @Provides method by any other name would return as sweet */ 
    @Provides MyConnectionFactory getConnectionFactory(SomeDependency dependency) { 
    return new MyConnectionFactory(dependency, url, 10000); 
    } 
} 

... 당신의 "래퍼 코드를 취하면 구성시 모든 생성자 매개 변수를 알고있는 경우

그러나 똑같이과 같을 것이다 당신의 모듈에 @Provides 방법을 만들 수 "3 개의 비어 있지 않은 공백 라인을 추가로 제공합니다. Guice는 자동으로 X, Provider<X> 또는 @Provides X의 모든 결합을 자동으로 X 또는 Provider<X>의 모든 주입에 바인딩하므로 가장 편리하지만 쉽게 바인딩 할 수 있습니다.

+0

감사합니다. 톤, 그것은 @Provides의 사용법을 오해 한 것 같습니다. 두 번째 예제는 정확히 내가 원했던 것입니다. 기본적으로 구성시 파일에서 속성을로드하여 공장에 전달합니다. –

관련 문제