ektorp を使用してCouchDBに接続します。
Ektorp HttpClient
インスタンスを構築する方法は、ビルダーパターンを使用することです。
HttpClient httpClient = new StdHttpClient.Builder()
.Host("mychouchdbhost")
.port(4455)
.build();
私は春に比較的新しいです。 HttpClient
を使用して作成するコンテキストでBuilder
を構成する方法について教えてください。
これを行う1つの方法は、@Configuration
。他のオプションはありますか?
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定義を構成に追加します。
<beans ...">
<bean name="myHttpClient" class="HttpFactoryBean">
<property name="port" value="8080"/>
<property name="Host" value="localhost"/>
</bean>
</beans>
次に、このBeanを別のBeanに注入できます。これは、StdHttpClient
インスタンスとして解決されます。
FlexyPool(接続プールの監視と自動サイズ設定ユーティリティ) を開発しているときに、同じ問題に遭遇したことがあるので、Javaベースの両方で an article と書きましたとxmlベースの例。
基本的には、次のビルダーから開始します。
public final class Configuration<T extends DataSource> extends ConfigurationProperties<T, Metrics, PoolAdapter<T>> {
public static final long DEFAULT_METRIC_LOG_REPORTER_PERIOD = 5;
public static class Builder<T extends DataSource> {
private final String uniqueName;
private final T targetDataSource;
private final PoolAdapterBuilder<T> poolAdapterBuilder;
private final MetricsBuilder metricsBuilder;
private boolean jmxEnabled = true;
private long metricLogReporterPeriod = DEFAULT_METRIC_LOG_REPORTER_PERIOD;
public Builder(String uniqueName, T targetDataSource, MetricsBuilder metricsBuilder, PoolAdapterBuilder<T> poolAdapterBuilder) {
this.uniqueName = uniqueName;
this.targetDataSource = targetDataSource;
this.metricsBuilder = metricsBuilder;
this.poolAdapterBuilder = poolAdapterBuilder;
}
public Builder setJmxEnabled(boolean enableJmx) {
this.jmxEnabled = enableJmx;
return this;
}
public Builder setMetricLogReporterPeriod(long metricLogReporterPeriod) {
this.metricLogReporterPeriod = metricLogReporterPeriod;
return this;
}
public Configuration<T> build() {
Configuration<T> configuration = new Configuration<T>(uniqueName, targetDataSource);
configuration.setJmxEnabled(jmxEnabled);
configuration.setMetricLogReporterPeriod(metricLogReporterPeriod);
configuration.metrics = metricsBuilder.build(configuration);
configuration.poolAdapter = poolAdapterBuilder.build(configuration);
return configuration;
}
}
private final T targetDataSource;
private Metrics metrics;
private PoolAdapter poolAdapter;
private Configuration(String uniqueName, T targetDataSource) {
super(uniqueName);
this.targetDataSource = targetDataSource;
}
public T getTargetDataSource() {
return targetDataSource;
}
public Metrics getMetrics() {
return metrics;
}
public PoolAdapter<T> getPoolAdapter() {
return poolAdapter;
}
}
Javaベースの構成の使用は簡単です。
@org.springframework.context.annotation.Configuration
public class FlexyDataSourceConfiguration {
@Bean
public Configuration configuration() {
return new Configuration.Builder(
UUID.randomUUID().toString(),
poolingDataSource,
CodahaleMetrics.BUILDER,
BitronixPoolAdapter.BUILDER
).build();
}
}
ただし、XMLベースの構成を使用することもできます。
<bean id="configurationBuilder" class="com.vladmihalcea.flexypool.config.Configuration$Builder">
<constructor-arg value="uniqueId"/>
<constructor-arg ref="poolingDataSource"/>
<constructor-arg value="#{ T(com.vladmihalcea.flexypool.metric.codahale.CodahaleMetrics).BUILDER }"/>
<constructor-arg value="#{ T(com.vladmihalcea.flexypool.adaptor.BitronixPoolAdapter).BUILDER }"/>
</bean>
<bean id="configuration" factory-bean="configurationBuilder" factory-method="build"/>
Spring FactoryBeanおよびFactoryMethodのドキュメントを確認してください。
あなたのケースについて明確ではありませんが;標準のBeanパターンset
メソッドを介してプロパティを公開する場合、ビルダーを拡張できます。つまり、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>
FactoryBean
はよりクリーンですが、- SpEL を使用する、より高速でダーティな方法があります。
これが 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番目のパラメーターからわかるように、ビルダーとそのメソッドをSpEL式として呼び出すことができ、クラスはそのFQNを介して指定する必要があるというニュアンスがあります。ただし、これにより、ボイラープレートFactoryBean全体を作成する必要がなくなります。