spark 大型專案實戰(六):使用者訪問session分析(六) --開發配置管理元件

weixin_33728268發表於2018-05-23

文章地址: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);
    }
    
}

歡迎關注,更多福利

7822142-7c49d382af3b7b7f.jpg
這裡寫圖片描述

相關文章