您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎樣讀取properties或yml文件數據并匹配,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
使用springboot獲取配置的文件的數據有多種方式,其中是通過注解@Value,此處通過IO獲取配置文件內容。
此前已經在另外的test.xml文件中的bean中可設置xx或yy,這里實現如果test.xml文件中沒有設置,可在application.*文件中進行設置。
如下:
try { InputStream stream = getClass().getClassLoader().getResourceAsStream("application.properties"); if(stream == null){ stream = getClass().getClassLoader().getResourceAsStream("application.yml"); InputStreamReader in = new InputStreamReader(stream, "gbk"); BufferedReader reader = new BufferedReader(in); String line; while ((line = reader.readLine()) != null) { if(line.trim().split(":")[0].contentEquals("xx")){ //在test.xml中讀取后可通過set傳值。這里也可以自己通過設置相應參數的set方法進行傳值 this.setXX(line.trim().split(":")[1].trim()); }else if(line.trim().split(":")[0].contentEquals("yy")){ this.setYY(line.trim().split(":")[1].trim()); } } }else{ InputStreamReader in = new InputStreamReader(stream, "gbk"); BufferedReader reader = new BufferedReader(in); String line; while ((line = reader.readLine()) != null) { if(line.trim().split("=")[0].contentEquals("xx")){ //在test.xml中讀取后可通過set傳值。這里也可以自己通過設置相應參數的set方法進行傳值 this.setXX(line.trim().split(":")[1].trim()); }else if(line.trim().split("=")[0].contentEquals("yy")){ this.setYY(line.trim().split(":")[1].trim()); } } } } catch (FileNotFoundException e) { logger.error("無法找到application.*文件",e); } catch (IOException e) { logger.error("讀取配置文件的ip或port有問題",e); }
@Value("${keys}") private String key;
這里需要注意的是
當前類要交給spring來管理
@Value不會賦值給static修飾的變量。
因為Spring的@Value依賴注入是依賴set方法,而自動生成的set方法是普通的對象方法,你在普通的對象方法里,都是給實例變量賦值的,不是給靜態變量賦值的,static修飾的變量,一般不生成set方法。若必須給static修飾的屬性賦值可以參考以下方法
private static String url; // 記得去掉static @Value("${mysql.url}") public void setDriver(String url) { JdbcUtils.url= url; }
但是該方案有個弊端,數組應該如何注入呢?
auth: clients: - id:1 password: 123 - id: 2 password: 123
@Component @ConfigurationProperties(prefix="auth") public class IgnoreImageIdConfig { private List<Map<String,String>> clients =new ArrayList<Integer>(); }
利用配置Javabean的形式來獲得值,值得注意的是,對象里面的引用名字(‘clients'),必須和yml文件中的(‘clients')一致,不然就會取不到數據,另外一點是,數組這個對象必須先new出來,如果沒有對象的話也會取值失敗的,(同理map形式也必須先將map對應的對象new出來)。
private static final String FILE_PATH = "classpath:main_data_sync.yml"; static Map<String, String> result = null; private static Properties properties = null; private YmlUtil() { } /** * 讀取yml的配置文件數據 * @param filePath * @param keys * @return */ public static Map<String, String> getYmlByFileName(String filePath, String... keys) { result = new HashMap<>(16); if (filePath == null) { filePath = FILE_PATH; } InputStream in = null; File file = null; try { file = ResourceUtils.getFile(filePath); in = new BufferedInputStream(new FileInputStream(file)); Yaml props = new Yaml(); Object obj = props.loadAs(in, Map.class); Map<String, Object> param = (Map<String, Object>) obj; for (Map.Entry<String, Object> entry : param.entrySet()) { String key = entry.getKey(); Object val = entry.getValue(); if (keys.length != 0 && !keys[0].equals(key)) { continue; } if (val instanceof Map) { forEachYaml(key, (Map<String, Object>) val, 1, keys); } else { String value = val == null ? null : JSONObject.toJSONString(val); result.put(key, value); } } } catch (FileNotFoundException e) { e.printStackTrace(); } return result; } public static Map<String, String> forEachYaml(String keyStr, Map<String, Object> obj, int i, String... keys) { for (Map.Entry<String, Object> entry : obj.entrySet()) { String key = entry.getKey(); Object val = entry.getValue(); if (keys.length > i && !keys[i].equals(key)) { continue; } String strNew = ""; if (StringUtils.isNotEmpty(keyStr)) { strNew = keyStr + "." + key; } else { strNew = key; } if (val instanceof Map) { forEachYaml(strNew, (Map<String, Object>) val, ++i, keys); i--; } else { String value = val == null ? null : JSONObject.toJSONString(val); result.put(strNew, value); } } return result; } /** * 獲取Properties類型屬性值 * @param filePath classpath:文件名 * @param key key值 * @return * @throws IOException */ public static String getProperties(String filePath,String key) throws IOException { if (properties == null) { Properties prop = new Properties(); //InputStream in = Util.class.getClassLoader().getResourceAsStream("testUrl.properties"); InputStream in = new BufferedInputStream(new FileInputStream(ResourceUtils.getFile(filePath))) ; prop.load(in); properties = prop; } return properties.getProperty(key); } public static void main(String[] args) { /*Map<String, String> cId = getYmlByFileName("classpath:test.yml", "auth", "clients"); //cId.get("") String json = cId.get("auth.clients"); List<Map> maps = JSONObject.parseArray(json, Map.class); System.out.println(maps);*/ try { String properties = getProperties("classpath:test.properties", "fileServerOperator.beanName"); System.out.println(properties); } catch (IOException e) { e.printStackTrace(); } }
auth: #認證 clients: - id: 1 secretKey: ba2631ee44149bbe #密鑰key - id: 2 secretKey: ba2631ee44149bbe #密鑰key
看完上述內容,你們對怎樣讀取properties或yml文件數據并匹配有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。