从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

Spring Environment仅用于初始化代码相关推荐

  1. java 只初始化一次_java – 仅对多个测试类执行一次初始化代码

    我正在为我的代码编写单元测试用例.我和Junit一起使用PowerMockito.我编写了一个初始化代码,它将处理我的应用程序中的所有初始化内容.以下是我的代码结构的方式: Class Service ...

  2. 在Spring Boot启动时运行代码

    Spring Boot会自动为我们执行很多配置,但是迟早您将不得不做一些自定义工作. 在本文中,您将学习如何进入应用程序引导生命周期并在Spring Boot启动时执行代码 . 因此,让我们看看该框架 ...

  3. 四、spring源码解读初始化

    4.1.什么是IOC/DI? IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现对象创建.依赖的代码,反转给容器来帮忙实现.那么必然的我们需要创建 ...

  4. 使用Spring特性优雅书写业务代码

    作者:阿里巴巴淘系技术 链接:https://www.zhihu.com/question/60761181/answer/1737592739 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...

  5. 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  6. 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)

    原文:利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...

  7. E0144“const char *“ 类型的值不能用于初始化 “char *“ 类型的实体

    下面这段代码会显示E0144"const char *" 类型的值不能用于初始化 "char *" 类型的实体的报错,说明了const char* 和char ...

  8. flink sql的datastream与dataset初始化代码汇总

    flink sql 数据类型 初始化代码汇总 dataset ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironme ...

  9. Java 初始化 代码块_Java中初始化块详解及实例代码

    Java中初始化块详解 在Java中,有两种初始化块:静态初始化块和非静态初始化块. 静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块中想初始化变量,那仅能初始化类变量, ...

最新文章

  1. CRichEditCtrl 好象没有复制、粘贴的功能(Ctrl+C、Ctrl+v都不好用
  2. Android 数据解析——Gson与json
  3. Linux(10)--上一级路径、nano、切换su、查看用户、修改目录的读写权限
  4. 使用Quick BI连接AnalyticDB for PostgreSQL数据源
  5. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
  6. 直播的一般流程是什么?
  7. Python模拟登陆,解密js代码实例:知乎登陆
  8. firefox 插件可能用得上的Firefox插件及下载
  9. eclipse maven 导出项目依赖的jar包
  10. 卡特兰数,高精度卡特兰数
  11. ps证件照换底色(红/蓝/其他颜色都可)
  12. 幼儿园清明节活动设计方案
  13. 【MATLAB】MATLAB 仿真 — 模拟调制系统 之 AM 调制过程
  14. SNSyx荣光医院合成配方与药剂合成攻略
  15. 黑马程序员————小牛皮糖学习笔记————IO流之未使用缓冲区读写文件
  16. python随机密码生成以整数17为随机数种子_简述pythonpytorch 随机种子的实现
  17. [转] C++中字符型变量的地址输出
  18. 抽象数据类型 C++实现 计算复数 [(8+6i)*(4+3i)]/[(8+6i)+(4+3i)]= ?
  19. linux无线8179,编译安装0bda 8179无线网卡
  20. SD 卡驱动程序分析

热门文章

  1. 漫画:什么是SnowFlake算法
  2. JDK9新特性实战:简化流关闭新姿势
  3. 动态网页开发基础【笔记】
  4. React不提交表单并且获取表单中的数据
  5. 云服务器的购买和宝塔面板的使用
  6. 轩辕剑之天之痕1-5java_轩辕剑游戏 轩辕剑1到5全系列下载
  7. java notify 指定_java的notify/notifyAll:如何notify指定的线程?
  8. 外部访问docker容器(docker run -p/-P 指令) docker run -d -p 5000:5000 {hostPort:containerPort(映射所有接口地}
  9. 架构师成长之路(内附推荐书籍)
  10. nginx负载均衡与反向代理