介绍
每当对象同时具有强制属性和可选属性时,我都喜欢使用构建器模式 。 但是构建对象通常是Spring框架的责任,因此让我们看看如何同时使用基于Java和XML的Spring配置来使用它。
建造者的例子
让我们从下面的Builder类开始。
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的配置
如果您使用的是基于 Spring Java的配置,那么您将采用以下方式:
@org.springframework.context.annotation.Configuration
public class FlexyDataSourceConfiguration {@Autowiredprivate PoolingDataSource poolingDataSource;@Beanpublic Configuration configuration() {return new Configuration.Builder(UUID.randomUUID().toString(),poolingDataSource,CodahaleMetrics.BUILDER,BitronixPoolAdapter.BUILDER).build();}@Bean(initMethod = "start", destroyMethod = "stop")public FlexyPoolDataSource dataSource() {Configuration configuration = configuration();return new FlexyPoolDataSource(configuration,new IncrementPoolOnTimeoutConnectionAcquiringStrategy.Builder(5),new RetryConnectionAcquiringStrategy.Builder(2));}
}
基于XML的配置
基于XML的配置比基于Java的配置更为冗长且不直观:
<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"/><bean id="dataSource" class="com.vladmihalcea.flexypool.FlexyPoolDataSource" init-method="start" destroy-method="stop"><constructor-arg ref="configuration"/><constructor-arg><array><bean class="com.vladmihalcea.flexypool.strategy.IncrementPoolOnTimeoutConnectionAcquiringStrategy$Builder"><constructor-arg value="5"/></bean><bean class="com.vladmihalcea.flexypool.strategy.RetryConnectionAcquiringStrategy$Builder"><constructor-arg value="2"/></bean></array></constructor-arg>
</bean>
结论
无论您已经选择了Spring配置模式如何,都可以使用Builder模式。 如果您不确定它的用处,请注意以下三个令人信服的原因 。
翻译自: https://www.javacodegeeks.com/2014/03/the-builder-pattern-and-the-spring-framework.html