javascript
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
總結
以上是生活随笔為你收集整理的Spring Environment仅用于初始化代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果怎么设置隐私(苹果怎么设置隐私应用加
- 下一篇: junit 测试mvc_Spring M