42

ektorpを使用して CouchDB に接続します。

ektorpHttpClientインスタンスを構築する方法は、ビルダー パターンを使用することです。

HttpClient httpClient = new StdHttpClient.Builder()
                                .host("mychouchdbhost")
                                .port(4455)
                                .build();

私は春に比較的新しいです。HttpClientを介して作成するために、自分のコンテキストで を構成する方法についてアドバイスをくださいBuilder

これを行う 1 つの方法は、 を使用することです@Configuration。他のオプションはありますか?

4

5 に答える 5

53

FactoryBeanあなたはインターフェースを実装しようとするかもしれません:

public class HttpFactoryBean implements FactoryBean<HttpClient>{

private String host;
private int port;


public HttpClient getObject() throws Exception {
    return new StdHttpClient.Builder()
                            .host(host)
                            .port(port)
                            .build();
}

public Class<? extends HttpClient> getObjectType() {
    return StdHttpClient.class;
}

public boolean isSingleton() {
    return true;
}

public void setHost(String host) {
    this.host = host;
}

public void setPort(int port) {
    this.port = port;
}}

そして、次のBean定義をconfigに追加します。

<beans ..."> 
   <bean name="myHttpClient" class="HttpFactoryBean">
       <property name="port" value="8080"/>
       <property name="host" value="localhost"/>
   </bean>
</beans>

次に、このBeanを別のBeanに注入できます。これは、StdHttpClientインスタンスとして解決されます。

于 2010-07-13T14:16:09.080 に答える
2

Spring FactoryBean および FactoryMethod のドキュメントを確認してください。

于 2010-07-13T12:52:43.790 に答える
1

あなたの場合は明示的ではありませんが。set標準の Bean パターンメソッドを介してプロパティを公開する場合、ビルダーを拡張することができます。つまり、 をorg.apache.httpcomponents:httpclient HttpClientBuilder例にとると、次のようになります。

public class HttpClientFactoryBean
        extends HttpClientBuilder
        implements InitializingBean,
                   FactoryBean<HttpClient> {

    private HttpClient value;

    @Override
    public void afterPropertiesSet() throws Exception {
        this.value = build();
    }

    @Override
    public HttpClient getObject() throws Exception {
        return value;
    }

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

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

}

これで、によって公開されたすべてのメソッドHttpClientBuilderがファクトリ Bean にアクセスできるようになりました。次のような構成が可能になりました。

<beans id="httpClient" class="com.drunkendev.factory.HttpClientFactoryBean">
  <beans name="defaultCredentialsProvider" ref="credentialsProvider"/>
  <beans name="targetAuthenticationStrategy">
    <util:constant static-field="org.apache.http.impl.client.TargetAuthenticationStrategy.INSTANCE"/>
  </beans>
</beans>
于 2014-02-11T12:51:36.783 に答える
0

はよりクリーンですが、 SpELFactoryBeanを使用して、より迅速でダーティな方法があります

これは、Neo4j ドライバーを構成した方法です。

<bean id = "neoDriver" class = "org.neo4j.driver.v1.GraphDatabase" 
        factory-method="driver">
    <constructor-arg value = "bolt://127.0.0.1:7687" />
    <constructor-arg>
        <bean class = "org.neo4j.driver.v1.AuthTokens" factory-method = "basic">
            <constructor-arg value = "neo4j" />
            <constructor-arg value = "***" />
        </bean>
    </constructor-arg>
    <constructor-arg type="org.neo4j.driver.v1.Config" 
        value = "#{T(org.neo4j.driver.v1.Config).build ()
            .withConnectionAcquisitionTimeout ( 10, T(java.util.concurrent.TimeUnit).SECONDS )
            .withConnectionTimeout ( 10, T(java.util.concurrent.TimeUnit).SECONDS )
            .toConfig ()
        }"
    />
</bean>

ファクトリ メソッドの 3 番目のパラメーターからわかるように、FQN を介してクラスを指定する必要があるニュアンスを使用して、ビルダーとそのメソッドを SpEL 式として呼び出すことができます。しかし、これにより、ボイラープレート FactoryBean 全体を作成する必要がなくなります。

于 2019-11-30T17:24:31.427 に答える