property 是 java 實現的 property 框架。java
優雅地進行屬性文件的讀取和更新git
寫入屬性文件後屬性不亂序github
靈活定義編碼信息數組
使用 OO 的方式操做 property 文件框架
ChangeLogide
Maven 3.x測試
Jdk 1.7+ui
<dependency> <groupId>com.github.houbb</groupId> <artifactId>property</artifactId> <version>0.0.4</version> </dependency>
PropertyBs.getInstance("read.properties").get("hello");
read.properties
爲文件路徑,hello
爲存在的屬性值名稱。編碼
final String value = PropertyBs.getInstance("read.properties") .getOrDefault("hello2", "default");
read.properties
爲文件路徑,hello2
爲不存在的屬性值名稱,default
爲屬性不存在時返回的默認值。日誌
PropertyBs.getInstance("writeAndFlush.properties").setAndFlush("hello", "world-set");
writeAndFlush.properties
爲文件路徑,hello
爲須要設置的屬性信息。
序號 | 方法 | 說明 |
---|---|---|
1 | getInstance(propertyPath) | 獲取指定屬性文件路徑的引導類實例 |
2 | charset(charset) | 指定文件編碼,默認爲 UTF-8 |
3 | get(key) | 獲取 key 對應的屬性值 |
4 | getOrDefault(key, defaultValue) | 獲取 key 對應的屬性值,不存在則返回 defaultValue |
5 | set(key, value) | 設置值(內存) |
6 | remove(key) | 移除值(內存) |
7 | flush() | 刷新內存變動到當前文件磁盤 |
9 | flush(path) | 刷新內存變動到指定文件磁盤 |
10 | set(map) | 設置 map 信息到內存 |
11 | set(bean) | 設置 bean 對象信息到內存 |
12 | asMap() | 返回內存中屬性信息,做爲 Map 返回 |
13 | asBean(bean) | 返回內存中屬性信息到 bean 對象中 |
咱們但願操做 property 能夠想操做對象同樣符合 OO 的思想。
User user = new User(); user.setName("hello"); user.setHobby("hobby"); final long time = 1574147668411L; user.setBirthday(new Date(time)); PropertyBs propertyBs = PropertyBs.getInstance("setBean.properties") .set(user); Assert.assertEquals("hobby", propertyBs.get("myHobby")); Assert.assertEquals("1574147668411", propertyBs.get("birthday"));
PropertyBs propertyBs = PropertyBs.getInstance("setBean.properties" .set("myHobby", "play") .set("birthday", "1574147668411"); User user = new User(); propertyBs.asBean(user); Assert.assertEquals("play", user.getHobby()); Assert.assertEquals(1574147668411L, user.getBirthday().getTime());
public class User { private String name; @PropertyField("myHobby") private String hobby; @PropertyField(converter = DateValueConverter.class) private Date birthday; }
序號 | 屬性 | 默認值 | 說明 |
---|---|---|---|
1 | value | 當前字段名稱 | 對應的 property 屬性名稱 |
2 | converter | 默認轉換實現 DefaultValueConverter |
對當前字段進行屬性的轉換處理 |
這個就是咱們針對 Date 類型,本身實現的處理類型。
實現以下:
public class DateValueConverter implements IValueConverter { @Override public Object fieldValue(String value, IFieldValueContext context) { return new Date(Long.parseLong(value)); } @Override public String propertyValue(Object value, IPropertyValueContext context) { Date date = (Date)value; return date.getTime()+""; } }
有時候一個屬性多是集合或者數組,這裏暫時給出比較簡單的實現。
將字段值直接根據逗號分隔,做爲屬性值。
UserArrayCollection userArrayCollection = buildUser(); PropertyBs propertyBs = PropertyBs.getInstance("setBeanArrayCollection.properties") .set(userArrayCollection); Assert.assertEquals("array,collection", propertyBs.get("alias")); Assert.assertEquals("array,collection", propertyBs.get("hobbies"));
public class UserArrayCollection { private List<String> alias; private String[] hobbies; }
暫時只支持 String 類型,不想作的過於複雜。
後期將考慮添加各類類型的支持。
有時候咱們在一個對象中會引用其餘對象,好比 對象 a 中包含對象 b。
這裏採用 a.b.c 這種方式做爲屬性的 key, 更加符合使用的習慣。
Book book = new Book(); book.name("《海底兩萬裏》").price("12.34"); UserEntry user = new UserEntry(); user.name("海倫").book(book).age("10"); PropertyBs propertyBs = PropertyBs.getInstance("setBeanEntry.properties") .set(user); Assert.assertEquals("海倫", propertyBs.get("name")); Assert.assertEquals("10", propertyBs.get("age")); Assert.assertEquals("《海底兩萬裏》", propertyBs.get("book.name")); Assert.assertEquals("12.34", propertyBs.get("book.price"));
Map<String, String> map = new HashMap<>(); map.put("name", "海倫"); map.put("age", "10"); map.put("book.name", "《海底兩萬裏》"); map.put("book.price", "12.34"); UserEntry userEntry = new UserEntry(); PropertyBs.getInstance("setBeanEntry.properties") .set(map) .asBean(userEntry); Assert.assertEquals("UserEntry{name='海倫', age=10, book=Book{name='《海底兩萬裏》', price=12.34}}", userEntry.toString());
public class UserEntry { private String name; private String age; @PropertyEntry private Book book; }
public class Book { private String name; private String price; }
@PropertyEntry
註解用來標識一個字段是否採用多級對象的方式表示。
這個註解只有一個屬性,就是 value()
,能夠用來給當前字段指定一個別稱,和 @PropertyField
別稱相似。