spark 大型專案實戰(六):使用者訪問session分析(六) --開發配置管理元件
文章地址:http://www.haha174.top/article/details/259340
1.簡述
配置管理元件
- 1、配置管理元件可以複雜,也可以很簡單,對於簡單的配置管理元件來說,只要開發一個類,可以在第一次訪問它的
時候,就從對應的properties檔案中,讀取配置項,並提供外界獲取某個配置key對應的value的方法
- 2、如果是特別複雜的配置管理元件,那麼可能需要使用一些軟體設計中的設計模式,比如單例模式、直譯器模式
可能需要管理多個不同的properties,甚至是xml型別的配置檔案
- 3、我們這裡的話,就是開發一個簡單的配置管理元件,就可以了
具體的程式碼和註釋如下
import java.io.InputStream;
import java.util.Properties;
/**
* 配置管理元件
*
* 1、配置管理元件可以複雜,也可以很簡單,對於簡單的配置管理元件來說,只要開發一個類,可以在第一次訪問它的
* 時候,就從對應的properties檔案中,讀取配置項,並提供外界獲取某個配置key對應的value的方法
* 2、如果是特別複雜的配置管理元件,那麼可能需要使用一些軟體設計中的設計模式,比如單例模式、直譯器模式
* 可能需要管理多個不同的properties,甚至是xml型別的配置檔案
* 3、我們這裡的話,就是開發一個簡單的配置管理元件,就可以了
*
* @author haha174
*
*/
public class ConfigurationManager {
// Properties物件使用private來修飾,就代表了其是類私有的
// 那麼外界的程式碼,就不能直接通過ConfigurationManager.prop這種方式獲取到Properties物件
// 之所以這麼做,是為了避免外界的程式碼不小心錯誤的更新了Properties中某個key對應的value
// 從而導致整個程式的狀態錯誤,乃至崩潰
private static Properties prop = new Properties();
/**
* 靜態程式碼塊
*
* Java中,每一個類第一次使用的時候,就會被Java虛擬機器(JVM)中的類載入器,去從磁碟上的.class檔案中
* 載入出來,然後為每個類都會構建一個Class物件,就代表了這個類
*
* 每個類在第一次載入的時候,都會進行自身的初始化,那麼類初始化的時候,會執行哪些操作的呢?
* 就由每個類內部的static {}構成的靜態程式碼塊決定,我們自己可以在類中開發靜態程式碼塊
* 類第一次使用的時候,就會載入,載入的時候,就會初始化類,初始化類的時候就會執行類的靜態程式碼塊
*
* 因此,對於我們的配置管理元件,就在靜態程式碼塊中,編寫讀取配置檔案的程式碼
* 這樣的話,第一次外界程式碼呼叫這個ConfigurationManager類的靜態方法的時候,就會載入配置檔案中的資料
*
* 而且,放在靜態程式碼塊中,還有一個好處,就是類的初始化在整個JVM生命週期內,有且僅有一次,也就是說
* 配置檔案只會載入一次,然後以後就是重複使用,效率比較高;不用反覆載入多次
*/
static {
try {
// 通過一個“類名.class”的方式,就可以獲取到這個類在JVM中對應的Class物件
// 然後再通過這個Class物件的getClassLoader()方法,就可以獲取到當初載入這個類的JVM
// 中的類載入器(ClassLoader),然後呼叫ClassLoader的getResourceAsStream()這個方法
// 就可以用類載入器,去載入類載入路徑中的指定的檔案
// 最終可以獲取到一個,針對指定檔案的輸入流(InputStream)
InputStream in = ConfigurationManager.class
.getClassLoader().getResourceAsStream("application.properites");
// 呼叫Properties的load()方法,給它傳入一個檔案的InputStream輸入流
// 即可將檔案中的符合“key=value”格式的配置項,都載入到Properties物件中
// 載入過後,此時,Properties物件中就有了配置檔案中所有的key-value對了
// 然後外界其實就可以通過Properties物件獲取指定key對應的value
prop.load(in);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取指定key對應的value
*
* 第一次外界程式碼,呼叫ConfigurationManager類的getProperty靜態方法時,JVM內部會發現
* ConfigurationManager類還不在JVM的記憶體中
*
* 此時JVM,就會使用自己的ClassLoader(類載入器),去對應的類所在的磁碟檔案(.class檔案)中
* 去載入ConfigurationManager類,到JVM記憶體中來,並根據類內部的資訊,去建立一個Class物件
* Class物件中,就包含了類的元資訊,包括類有哪些field(Properties prop);有哪些方法(getProperty)
*
* 載入ConfigurationManager類的時候,還會初始化這個類,那麼此時就執行類的static靜態程式碼塊
* 此時我們們自己編寫的靜態程式碼塊中的程式碼,就會載入application.properites檔案的內容,到Properties物件中來
*
* 下一次外界程式碼,再呼叫ConfigurationManager的getProperty()方法時,就不會再次載入類,不會再次初始化
* 類,和執行靜態程式碼塊了,所以也印證了,我們上面所說的,類只會載入一次,配置檔案也僅僅會載入一次
*
* @param key
* @return value
*/
public static String getProperty(String key) {
return prop.getProperty(key);
}
}
歡迎關注,更多福利
相關文章
- Spark綜合使用及使用者行為案例訪問session統計分析實戰-Spark商業應用實戰SparkSession
- SpringBoot 實戰 (六) | 用 JdbcTemplates 訪問 MysqlSpring BootJDBCMySql
- Python六大實戰開發專案!Python基礎學習Python
- TypeScript + 大型專案實戰TypeScript
- 大型分散式網站架構實戰專案分析分散式網站架構
- 從無到有構建vue實戰專案(六)Vue
- 鴻蒙專案實戰(六):識別本地圖片鴻蒙地圖
- 專案實戰--製作web管理銳捷交換機(六)Web
- <Zhuuu_ZZ>Spark專案實戰-航班飛行網圖分析Spark
- Flutter完整開發實戰詳解(六、 深入Widget原理)Flutter
- 某大型商超客戶採購資料分析(Spark實戰)Spark
- flask 專案開發實戰Flask
- FFmpeg開發筆記(六)如何訪問Github下載FFmpeg原始碼筆記Github原始碼
- 微服務架構大型電商專案開發流程及技術實戰微服務架構
- TensorFlow系列專題(六):實戰專案Mnist手寫資料集識別
- 大資料專案實戰之 --- 使用者畫像專案分析大資料
- 專案實戰介面開發SpringBootSpring Boot
- 開源電子書專案FBReader初探(六)
- 從零開始React專案架構(六)React架構
- Flowable實戰(六)整合JPA
- Java併發實戰(六) 任務執行Java
- 做六西格瑪專案時,過程分析是如何開展的?
- Vue + Spring Boot 專案實戰(十四):使用者認證方案與完善的訪問攔截VueSpring Boot
- 小程式雲開發專案實戰
- django專案開發實戰——部落格Django
- 最新Python開發專案實戰(完整)Python
- 【原創】專案六 Load Of The Root
- Elasticsearch技術解析與實戰(六)Elasticsearch併發Elasticsearch
- 前端開發入門到實戰:六種組織CSS的方式前端CSS
- 專案實戰小問題:
- 從0到1使用VUE-CLI3開發實戰(六):這是一個有程式碼潔癖的專案Vue
- 大型開發專案中 git 工作流的最佳實踐Git
- 一本實踐的專案開發《Python專案開發實戰(第2版)》Python
- IDEA開發Spark應用實戰(Scala)IdeaSpark
- 大型Java進階專題(六)設計模式之代理模式Java設計模式
- 專案實戰之元件化架構元件化架構
- 基於.NetCore開發部落格專案 StarBlog - (11) 實現訪問統計NetCore
- Spark機器學習實戰 (十一) - 文字情感分類專案實戰Spark機器學習