Builder模式和Spring框架

介绍

每当对象同时具有强制属性和可选属性时,我都喜欢使用构建器模式 。 但是构建对象通常是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php数据库中统计人数用什么方法,在PHP中处理用户统计信息的最佳方法是什么

我如何处理 PHP中的用户统计信息&#xff1f;我可以选择两种明显的方法.两者都有缺陷.>必要时选择MySQL COUNT.这里的缺陷是,如果你要计算很多行,那么它可能会很慢,特别是当你必须在看似每个页面加载时这样做.好处是计数总是正确的.>将用户统计信息存储在统计信息表中.这…

作用域、执行环境、闭包(四)

本文也同步发表在我的公众号“我的天空” 上一期我们已经介绍了闭包&#xff0c;由于闭包可以延长函数内部的变量的生存周期&#xff0c;因此我们可以将不需要暴露在全局的变量封装成函数的内部变量&#xff0c;从而避免代码污染。 譬如要实现一个简单的累加器&#xff0c;为了…

今天发布了一个新的网站矩阵www.wimatrix.cn

关于科技生活新知的&#xff0c;digg类型&#xff0c;欢迎朋友们来访问&#xff0c;并提出宝贵的意见网址是 http://www.wimatrix.cn 转载于:https://www.cnblogs.com/liugod/archive/2007/09/29/910637.html

[Bzoj2243][SDOI2011]染色(线段树树剖)

题目链接&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id2243 线段树树链剖分&#xff0c;在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色&#xff0c;向上更新时需要判断左区间的右边界是否和右区间的左边界相等。在剖分求LCA的过程中需要在求…

php static_castunsigned int,C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)...

上节讲到&#xff0c;隐式类型转换是安全的&#xff0c;显式类型转换是有风险的&#xff0c;C语言之所以增加强制类型转换的语法&#xff0c;就是为了强调风险&#xff0c;让程序员意识到自己在做什么。但是&#xff0c;这种强调风险的方式还是比较粗放&#xff0c;粒度比较大&…

NetBeans IDE 8.0和Java 8的新功能

NetBeans IDE 8.0已发布&#xff0c;还为Java 8技术提供了新功能。 它具有用于与Java SE 8&#xff0c;Java SE Embedded 8和Java ME Embedded 8配合使用的代码分析器和编辑器。IDE还具有新的增强功能&#xff0c;这些功能进一步改善了其对使用PrimeFaces对Maven和Java EE的支持…

AngularJS(九):路由

本文也同步发表在我的公众号“我的天空” AngularJS路由 AngularJS路由可以让我们通过不同的URL访问不同页面&#xff08;似乎是废话&#xff09;&#xff0c;其价值主要体现在单页面的web应用中&#xff08;single page web application&#xff0c;SPA&#xff09;&#xff0…

(转)Oracle中实现行列转换的方法

(转自)http://blog.csdn.net/Torrice/archive/2006/01/25/587986.aspx 我们在写SQL语句的时候经常需要用到行与列的转换问题&#xff0c;对于一个新手来说可能比较困难&#xff0c;其实你只要能够熟练运用Decode和Sum函数&#xff0c;这个问题就迎刃而解. Create table tes…

[C3W2] Structuring Machine Learning Projects - ML Strategy 2

第二周&#xff1a;机器学习策略&#xff08;2&#xff09;&#xff08;ML Strategy&#xff08;2&#xff09;&#xff09; 误差分析&#xff08;Carrying out error analysis&#xff09; 你好&#xff0c;欢迎回来&#xff0c;如果你希望让学习算法能够胜任人类能做的任务&a…

mysql语句执行顺序图示

转载于:https://www.cnblogs.com/whalesea/p/10382227.html

玩Java 8 – Lambda和并发

因此Java 8不久前发布&#xff0c;具有许多功能和更改。 我们所有的Java狂热者一直在等待这个历史&#xff0c;从他们最初宣布Java 7的所有强大功能开始一直到最终被取消。 我最近才有时间实际开始给它一个真实的外观&#xff0c;我将我的家庭项目更新到了8个&#xff0c;我不…

用matlab 拟合实数解,求大神指点matlab用拟合的方式解延迟微分方程组参数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼dy(1)-k*y(1)*y(2);dy(2)Z(3,1)-a*y(2)-q*y(2);dy(3)k*y(1)*y(2)-Z(3,1);dy(4)a*y(2);dy(5)q*y(2);t12345678910111213141516171819202122232425262728293031323334353637383940y208563475657545454535252515150504948484747464545…

AngularJS(三):重复HTML元素、数据绑定

本文也同步发表在我的公众号“我的天空” 重复HTML元素 在前端的页面编写中&#xff0c;我们会经常遇到重复HTML元素&#xff0c;譬如绘制表格、菜单等&#xff0c;如以下代码显示一个简单的li列表&#xff1a; <body> <ul id"ul_cities"> </ul…

hyper-v下的ubuntu虚拟机分辨率修改

修改/etc/default/grub sudo vim /etc/default/grub 改变前: GRUB_CMDLINE_LINUX_DEFAULT"quiet splash" 改变后: GRUB_CMDLINE_LINUX_DEFAULT"quiet splash videohyperv_fb:1920x1080" 更新grub配置 sudo update-grub 重启即可生效 sudo reboot 转载于:ht…

gopacket 在 windows 上面遇到的问题

前阵子有个需求是使用 golang 抓包改包&#xff0c;我用到了 gopacket 这个包&#xff0c;但是出了一些小问题。 我按照网上的方法进行使用 OpenLive 抓包&#xff0c;发现并不行&#xff0c;报错 error open adapter 啥啥啥。 经过调试发现根本找不到这个网卡&#xff0c;需要…

使用表中的数组数据类型

在这篇文章中&#xff0c;我想跟进我以前关于Oracle集合数据类型的文章 &#xff0c;并且我将集中精力使用af&#xff1a;table组件中的oracle.jbo.domain.Array属性。 因此&#xff0c;在我的数据库中&#xff0c;我具有以下SQL类型&#xff1a; create or replace type var…

最伟大最不可思议最令人感动的父亲

转载于:https://www.cnblogs.com/chenou/archive/2007/10/23/935014.html

关于数据库名、实例名

最近因看到论坛有人问起这方面的东西&#xff0c;将自己的理解加上查阅相关资料整理如下&#xff0c;如果不全或不当的地方&#xff0c;望指正并补全它。 数据库名(DB_NAME)、实例名(Instance_name)、以及操作系统环境变量(ORACLE_SID) 在ORACLE7、8数据库中只有数据库名(db_…

linux 文件inode,linux文件系统-inode学习整理

linux文件系统-inode学习整理介绍linux文件系统可讲的模块有很多&#xff0c;包括文件系统整体架构、文件系统分类、虚拟文件系统以及文件系统存储结构等等&#xff0c;本文主要介绍的是文件系统的存储结构&#xff0c;也就是本文的重点-inode。文件存储结构首先从开天辟地开始…

操作方法:Maven的Spring Boot和Thymeleaf

Spring Boot是一款很棒的软件&#xff0c;可让您在几秒钟内引导Spring应用程序。 它确实有效。 尽可能少的配置即可上手。 而且仍然可以更改默认值。 让我们看看用Thymeleaf和Maven引导Spring MVC并在IntelliJ中使用它是多么容易。 Spring MVC Thymeleaf与Maven的基本设置 确…