麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

properties屬性文件設計&實踐(1)

2019-11-14 22:41:05
字體:
來源:轉載
供稿:網友
PRoperties屬性文件設計&實踐(1) - 多個屬性文件

在項目中,一般會在類路徑下存在這樣的一個屬性文件,如:config.properties systemconfig.properties等,通過屬性文件可以實現以下目的 1. 統一維護公用的配置性屬性 2. 不修改class/jar,改變類的行為

一般還會針對此屬性文件提供一個類來讀取其屬性

 

本文介紹一種在設計公用代碼時的屬性文件通用設計思路,即多個屬性文件 1. 默認屬性文件     在公用代碼工程維護,發布時直接打包到jar中,其中的屬性會被2、3覆蓋 2. 各工程自定義屬性文件     在公用代碼工程不維護,使用者提供,其中屬性會被3覆蓋 3. 不可覆蓋的屬性文件     公用代碼工程維護,發布時直接打包到jar中

具體實現

1.Configuration 屬性讀取類

2.config.default.properties 默認屬性文件

3.config.properties 各工程自定義屬性文件

4.config.nooverride.properties 不可覆蓋的屬性文件

 

1.Configuration 屬性讀取類

 

package mov.demo;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 屬性讀取類 * @author mov * @since 0.0.1 */public class Configuration {    private static Logger log = LoggerFactory.getLogger(Configuration.class);        private static Properties props = new Properties();;        /** 默認屬性文件 */    private static final String CONFIG_FILE_DEFAULT = "config.default.properties";        /** 各工程自定義配置 */    private static final String CONFIG_FILE_USER_DEFINED = "config.properties";        /** 不可覆蓋的屬性文件 */    private static final String CONFIG_FILE_NO_OVERRIDE = "config.nooverride.properties";    static {        int successLoadedCount = 0;        /* 先加載默認配置 */        if (loadConfig(CONFIG_FILE_DEFAULT)) {            ++successLoadedCount;        }                /* 再加載用戶自定義配置,以覆蓋默認 */        if (loadConfig(CONFIG_FILE_USER_DEFINED)) {            ++successLoadedCount;        }        /* 最后加載不可覆蓋的配置,以覆蓋所有 */        if (loadConfig(CONFIG_FILE_NO_OVERRIDE)) {            ++successLoadedCount;        }                if (successLoadedCount == 0) {            log.error("all config file load error");        }    }    /**     * 獲取屬性值     * @param key     * @return 屬性存在時返回對應的值,否則返回""     */     public static String getCfgValue(String key) {        return getCfgValue(key, "");    }        /**     * 獲取屬性值     * @param key     * @param defaultValue     * @return 屬性存在時返回對應的值,否則返回defaultValue     */     public static String getCfgValue(String key, String defaultValue) {        return props.getProperty(key, defaultValue);    }        /**     * 獲取屬性值     * @param key     * @return 屬性存在且可以轉為int時返回對應的值,否則返回0     */    public static int getIntCfgValue(String key) {        return getIntCfgValue(key, 0);    }    /**     * 獲取屬性值     * @param key     * @param defaultValue     * @return 屬性存在且可以轉為int時時返回對應的值,否則返回defaultValue     */    public static int getIntCfgValue(String key, int defaultValue) {        String val = getCfgValue(key);        if (!isEmpty(val)) {            try {                return Integer.parseInt(val);            } catch (NumberFormatException e) {                log.warn("error get config. value '{}' is not a valid int for key '{}'"                        , val, key);            }        }                return defaultValue;    }        /**     * 獲取屬性值     * @param key     * @return 屬性存在時返回對應的值,否則返回false     */    public static boolean getBooleanCfgValue(String key) {        return getBooleanCfgValue(key, false);    }        /**     * 獲取屬性值     * @param key     * @param defaultValue     * @return 屬性存在時返回對應的值,否則返回defaultValue     */    public static boolean getBooleanCfgValue(String key, boolean defaultValue) {        String val = getCfgValue(key);        if (!isEmpty(val)) {            return Boolean.parseBoolean(val);        } else {            return defaultValue;        }    }    private static boolean loadConfig(String configFile) {        boolean success = false;        InputStream inputStream = null;        try {            inputStream = Configuration.class.getClassLoader().getResourceAsStream(configFile);                        if (inputStream != null) {                props.load(inputStream);                success = true;            } else {                log.warn("project config file 'classpath:{}' not found", configFile);            }        } catch (Throwable e) {            log.error("error load config file 'classpath:{}'", configFile, e);        } finally {            if (inputStream != null) {                try {                    inputStream.close();                } catch (IOException e) {                    // do nothing                }            }        }                return success;    }        private static boolean isEmpty(String val) {        return val == null || val.length() == 0;    }}

 

2.config.default.properties 默認屬性文件
string.in.default=defaultstring.in.defaultAndUserdefine=defaultstring.in.all=default

 

3.config.properties 各工程自定義屬性文件
string.in.defaultAndUserdefine=userdefinestring.in.all=userdefineint.positive=1000int.negative=-1000int.overflow=2147483648int.underflow=-2147483649boolean.true=TruEboolean.false=whatever
 4.config.nooverride.properties 不可覆蓋的屬性文件
string.in.all=nooverride

 

單元測試
package mov.demo;import static org.junit.Assert.*;import org.junit.Test;public class ConfigurationTest {    @Test    public void testGetCfgValueString() {        assertEquals("", Configuration.getCfgValue("not.exists"));        assertEquals("default", Configuration.getCfgValue("string.in.default"));        assertEquals("userdefine", Configuration.getCfgValue("string.in.defaultAndUserdefine"));        assertEquals("nooverride", Configuration.getCfgValue("string.in.all"));    }    @Test    public void testGetCfgValueStringString() {        assertEquals(null, Configuration.getCfgValue("not.exists", null));        assertEquals("default", Configuration.getCfgValue("string.in.default", null));        assertEquals("userdefine", Configuration.getCfgValue("string.in.defaultAndUserdefine", null));        assertEquals("nooverride", Configuration.getCfgValue("string.in.all", null));    }    @Test    public void testGetIntCfgValueString() {        assertEquals(0, Configuration.getIntCfgValue("not.exists"));        assertEquals(1000, Configuration.getIntCfgValue("int.positive"));        assertEquals(-1000, Configuration.getIntCfgValue("int.negative"));        assertEquals(0, Configuration.getIntCfgValue("int.overflow"));        assertEquals(0, Configuration.getIntCfgValue("int.underflow"));    }    @Test    public void testGetIntCfgValueStringInt() {        assertEquals(-1, Configuration.getIntCfgValue("not.exists", -1));        assertEquals(1000, Configuration.getIntCfgValue("int.positive", -1));        assertEquals(-1000, Configuration.getIntCfgValue("int.negative", -1));        assertEquals(-1, Configuration.getIntCfgValue("int.overflow", -1));        assertEquals(-1, Configuration.getIntCfgValue("int.underflow", -1));    }    @Test    public void testGetBooleanCfgValueString() {        assertFalse(Configuration.getBooleanCfgValue("not.exists"));        assertTrue(Configuration.getBooleanCfgValue("boolean.true"));        assertFalse(Configuration.getBooleanCfgValue("boolean.false"));    }    @Test    public void testGetBooleanCfgValueStringBoolean() {        assertTrue(Configuration.getBooleanCfgValue("not.exists", true));        assertTrue(Configuration.getBooleanCfgValue("boolean.true", false));        assertFalse(Configuration.getBooleanCfgValue("boolean.false", true));    }}

 

運行單元測試類,結果如下

image

 

源碼下載Github https://github.com/Mov-hh/java-demo


上一篇:java基礎--溫故而知新 (01)

下一篇:JSTL

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美视频在线一区二区三区 | 日韩黄站 | 91成人午夜性a一级毛片 | 久久国产成人午夜av浪潮 | 69av导航 | chinesehdxxxx无套 久久另类视频 | 免费看黄色三级毛片 | 中国女警察一级毛片视频 | 日韩视频―中文字幕 | 91午夜在线观看 | 国产人成精品综合欧美成人 | 日韩黄色一区 | 国产精品久久久不卡 | 性高潮一级片 | av在线播放亚洲 | 在线看91 | 偿还电影免费 | 亚洲午夜久久久精品一区二区三区 | 福利在线小视频 | 日本黄色免费片 | 久久精品视频黄色 | 午夜爽爽爽男女免费观看hd | 亚洲国产视频网 | 中国老女人一级毛片视频 | 国产精品一区二区三区在线看 | 天天夜碰日日摸日日澡性色av | 欧美黑大粗硬毛片视频 | 日韩在线毛片 | 国产精品视频一区二区噜噜 | 欧美视频一区二区三区在线观看 | 久久久久国产成人精品亚洲午夜 | 久草手机在线观看视频 | 亚洲午夜久久久久 | 国内精品视频饥渴少妇在线播放 | 久久精片 | 亚洲天堂在线电影 | xxxxhdvideosex| 一级做受毛片免费大片 | 成人不卡在线观看 | 欧美在线观看视频一区二区 | 久久成人免费网站 |