Spring Environment仅用于初始化代码

从3.1版开始, Spring框架提供了对几种不同来源的抽象,通过它们您可以轻松地配置应用程序: Environment

在这篇文章中,我描述了一个微基准测试,我可以证明该基准测试是一个方便的API(如果您在应用程序中使用Spring的话),但它可能会导致性能下降,因此您不应在初始化代码之外使用它。

怎么运行的

在获取数字之前,请先快速浏览一下对本帖子很重要的Environment内部。

从文档中:

属性在几乎所有应用程序中都起着重要作用,并且可能源自各种来源:属性文件,JVM系统属性,系统环境变量,JNDI,Servlet上下文参数,临时属性对象,映射等。 环境对象与属性的关系是为用户提供方便的服务界面,以配置属性源并从中解析属性。

因此,您可以使用Environment通过简单的getProperty调用访问所需值,从而为不同策略提供的属性提供通用接口。 看下面的Groovy代码:

@Componentpublic class Greeter {private Environment environment@Autowiredpublic Greeter greeter(Environment environment){this.environment = environment}def nickName(user) {environment.getProperty("user") // here be magic}def greet(user) {def nick = nickName(user)if (name == null) println "Hi, ${user}!"else println "Hi, ${nick}!"}}

现在,我可以在属性文件中指定昵称,以便我可以用更熟悉的昵称向用户打招呼,同时仍然可以向没有昵称的用户致敬。 整洁,但是性能如何?

现在,我可以在属性文件中指定昵称,以便我可以用更熟悉的昵称向用户打招呼,同时仍然可以向没有昵称的用户致敬。 整洁,但是性能如何?

隐藏的异常

我在调试正在处理的网站中的几个慢页面时进行了此练习:KLM主站点的目标页面 。 尽管性能总体上令人满意,但有两页不断给出高于第二的响应时间。 绝对太多了 。

在我们的代码中,我们将一些国家/地区名称转换为可查询的外部服务密钥。 我们还需要覆盖该规则的非常特殊的例外情况,即本来简单的翻译算法。 实际的代码非常类似于上面的Greeter.greet(user) ,并且Flight Recorder会话最终为我们提供了性能瓶颈(单击以打开):

例外情况

对于12页的刷新,我们无声地抛出140k +异常。 例外是sloooooow ,即使您只是创建它们。

查看引发的异常,实际上很容易理解发生的情况: Environment检查所请求的属性是否在当前JNDI上下文中定义。 但是,如果找不到该名称,则会引发NameNotFoundException 。 在我们的特定情况下,我们对异常情况使用属性查找,这意味着绝大多数情况下都会引发异常。

微型基准

我汇总了一个微型基准测试,以评估原始属性查找策略与在类构建时加载相关属性的简单方法相比的潜在性能提升。 我使用了Java Microbenchmark Harness ,它在使JVM上的微基准测试变得容易方面做得了不可思议的工作:JIT,热身,类加载,所有这些都交给您了,您可以继续进行代码测试。 结果如下(数字越大越好):

[每次调用的属性查询]

结果:28917.876?(99.9%)183.630 ops / s [平均]统计数据:(最小,平均,最大)=(25688.067,28917.876,30976.876),stdev = 777.500
置信区间(99.9%):[28734.246,29101.505]


[班级建设中的财产装载]

结果:159062.900?(99.9%)1013.309 ops / s [平均值]统计信息:(最小值,平均值,最大值)=(138707.926,159062.900,177183.549),stdev = 4290.413
置信区间(99.9%):[158049.591,160076.209]

不出所料,速度快了五倍。

结论

我不是Spring的忠实拥护者,但是如果您使用Spring,则Environment类是您的应用程序配置的简单接口。 但是,除非您将JNDI用作配置属性的主要存储,否则,只有当您在初始化代码中使用它,而不是在在线处理请求时,它的性能特性才能使其成为一个很好的工具。

翻译自: https://www.javacodegeeks.com/2016/12/spring-environment-initialization-code.html

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

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

相关文章

linux查看和关闭后台执行程序

后台执行的程序会有一个pid,查看后台程序主要用到jobs,ps 关闭后台程序用到kill详细说明转自http://blog.csdn.net/tianlesoftware/article/details/6165753 一. 有关进程的几种常用方法 1.1 & 符号 在命令后面加上一个 & 符号,表示该命令放在后台执行&…

Mysql 多表联合查询效率分析及优化

1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用, 如: SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2 由于其返回的结果为被连接的两…

Python的__getattr__方法学习

内容部分来自网络 __getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数; 如果没有定义这个函数,那么抛出Attribu…

python to_excel新增sheet_Python使用xlrd和xlwt读写Excel的简单用法

前言数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件。因此用Python 进行数据相关的工作时,难免要和 Excel 打交道。标准的 Excel 文件(xls/xlsx)具有较复杂的格式,并不方便像普通文本文件一样直…

linux 线程管理、同步机制等

线程学了那么多有关进程的东西,一个作业从一个进程开始,如果你需要执行其他的东西你可以添加一些进程,进程之间可以通信、同步、异步。似乎所有的事情都可以做了。 对的,进程是当初面向执行任务而开发出来的,每个进程代…

SQL多表连接查询(详细实例)

本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,…

cf 1059e 思维 贪心 树

参考博客:http://www.cnblogs.com/waldenlake/p/9750249.html 题意:将一棵n个点的带权有根树剖分成尽量少的链,使得 (1)链的两个端点是祖先关系 (2)链含有的顶点个数小于等于L (3&am…

powermock模拟对象_使用PowerMock模拟构造函数

powermock模拟对象在我看来,依赖注入的主要好处之一是可以将模拟和/或存根对象注入代码中,以提高可测试性,增加测试覆盖率并编写更好,更有意义的测试。 但是,有时候您会遇到一些不使用依赖注入的传统代码,而…

宝塔 没有找到站点_宝塔面板正确开启TLS 1.3并删除TLS 1.1

昨天折腾了一个AlphaSSL泛域名证书后,心血来潮去SSL评分网站测试了一番,最后的结果竟然是B,这真是不能忍啊……为啥会是B,查看了原因,竟然是启用了TLS 1.1,所以为B。那么,删除TLS 1.1不就可以了…

线程同步机制:互斥量、信号量、读写锁、条件变量

一、互斥量(mutex) 互斥量本质上是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。 对互斥量进行加锁以后,任何其它试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放…

在Cloudfoundry上部署RESTful服务

在本文中,我们将使用Pivotal Cloud Foundry(PCF)Dev在Cloudfoundry上部署RESTful服务。 由于创建静态Web服务不是本文的一部分,因此我已经创建了employee-service ,它具有静态后端,可从GitHub进行克隆。 在…

mysql 全连接查询合并字段

1、创建两张表 t1如下: idname1a13a3 t2如下: idname1b12b25b5 联合查询合并字段: sql语句: SELECT t3.name AS B, t3.name1 AS C ,COALESCE(t3.id2,t3.id1) AS myId FROM (SELECT t1.id as id2 ,t1.name as name,t2.id as id…

小米刷第三方recovery_小米平板4/Plus LTE版本开启电话功能

众所周知,因为入网许可或通信基带使用权限的问题,小米平板4/plus LTE版本通过系统的方式阉割了通话功能,不过硬件完全是支持的,所有还是有办法让你的平板可以像手机一样,可以通话,可以发送短信。过Magisk刷…

最佳线程数总结(1

最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加。这个阀值我们认为是最佳线程数。 为什么要…

MongoDB和Java(5):Spring Data整合MongoDB(注解配置)

最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装、客户端操作、安全认证、副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很大。特此记录,以备查看。 文章目…

新浪微博爬虫设计(Python版)

最近手头上有一个项目,是关于新浪微博的,其中有一环要做新浪微博的爬虫。虽然之前把《Python学习手册》和《Python核心编程》都囫囵吞栆地通读完了,不过真正到做项目的时候还是什么都不会。于是在网上找了大量的资料。关于获取新浪微博的内容…

python 返回空格_Python面试之 is 和 == 的区别

Python爬虫人工智能学习教程​www.python88.cn面试实习生的时候,当问到 is 和 的区别时,很多同学都答不上来,搞不清两者什么时候返回一致,什么时候返回不一致。本文我们来看一下这两者的区别。我们先来看几个例子:a …

【数据库设计和SQL基础语法】--索引和优化--SQL语句性能调优

一、SQL语句性能调优的基本原则 1.1 确定性能指标 响应时间 SQL语句性能调优的基本原则之一是确定性能指标,而其中最为关键的指标之一就是响应时间。响应时间是衡量数据库系统性能的重要指标,它表示从用户发送一个查询请求到接收到查询结果所经过的时间…

boke练习: spring boot: security post数据时,要么关闭crst,要么添加隐藏域

spring boot: security post数据时&#xff0c;要么关闭crst,要么添加隐藏域 http.csrf().disable();或者&#xff1a; <input name"${_csrf.parameterName}" type"hidden" value"${_csrf.token}">转载于:https://www.cnblogs.com/achengm…

法线有接缝_发送带有接缝的活动邀请

法线有接缝这些天来&#xff0c;我的一位同事在使用带有接缝&#xff08;版本2.x&#xff09;的邮件模板发送事件邀请时遇到了问题。 从根本上讲&#xff0c;这应该不是一项艰巨的任务&#xff0c;因此我将简要说明使用接缝邮件模板发送事件邀请需要做些什么。 发送邮件邀请时&…