1. 程式人生 > >如何配置並獲取多個properties檔案源資訊

如何配置並獲取多個properties檔案源資訊

在搭配框架的時候,大多數時候都是需要配置多個properties檔案, 那麼這個時候,如何配置並獲取檔案裡的內容呢?

第一種方法:寫一個類,繼承PropertyPlaceholderConfigurer ,然後啟動的時候就載入:程式碼如下

package com.cmos.ngmttcontrol.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Decrypt the password to the properties file
 * 
 */
public final class PropertyConfigurer extends
		org.springframework.beans.factory.config.PropertyPlaceholderConfigurer {
	 private static final Pattern PATTERN = Pattern
	            .compile("\\$\\{([^\\}]+)\\}");
	 
	private static Properties props=null;
	private static Map<String, String> map=new HashMap<String, String>();
	
	//服務啟動時,該方法就會執行。
	protected void loadProperties(Properties props) throws IOException {
		super.loadProperties(props);
		PropertyConfigurer.setProps(props);
		
		props.size();
		if(props.size()>0){
			String key = null;
            String value = null;
            for(Entry<Object, Object> entry: props.entrySet()){
            	key = (String) entry.getKey();
                value = (String) entry.getValue();
                if(key != null){
                	value = getdynamicValue(key);
                	if(value != null){
                    	map.put(key, value);
                    }
                }
            }
		}
		try {
			/*String password = props.getProperty("password");
			String decryPassword = new String(EncryptionUtil.decode(
					EncryptionUtil.hex2byte(password), "cmoscmos".getBytes()));
			props.setProperty("password", decryPassword);*/
		} catch (Exception e) {
			logger.error("decode password in properties error!", e);
		}
	}
	
	
	/**
	 * 當從屬性檔案properties中通過key取值時,
	 * 要取的value中有變數時,必須使用該方法,才能獲取到正確的值。(如:變數${ip})
	 * 
	 * @param key
	 * @return
	 */
	private static String getdynamicValue(String key) {
        String value = props.getProperty(key);
        
        if(value ==null){
        	return null;
        }
        Matcher matcher = PATTERN.matcher(value);
        StringBuffer buffer = new StringBuffer();
        while (matcher.find()) {
            String matcherKey = matcher.group(1);
            String matchervalue = props.getProperty(matcherKey);
            if (matchervalue != null) {
                matcher.appendReplacement(buffer, matchervalue);
            }
        }
        matcher.appendTail(buffer);
        return buffer.toString();
	}
	/**
	 * 
	 * @param key
	 * @return
	 */
	public static String get(String key) {
		if(map.size()>0 && key !=null){
			return map.get(key);
		}else{
			return null;
		}
	}
	

	public static Properties getProps() {
		return props;
	}

	public static void setProps(Properties props) {
		PropertyConfigurer.props = props;
	}
	


}

這個程式碼寫好後,就需要在xml裡配置了

相關程式碼如下:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	
	<bean class="com.cmos.ngmttcontrol.util.PropertyConfigurer">
		<property name="order" value="1" />
	 	<property name="ignoreUnresolvablePlaceholders" value="true" />  
		<property name="locations">
			<list>
				<!--有新的properties檔案可以在這裡追加,然後通過PropertyConfigurer可以獲取值。-->
				<!--  <value>classpath:config/jdbc-${profiles.active}.properties</value>-->
				<!--<value>classpath:config/interfaceURL-${profiles.active}.properties</value>-->
				<value>${interfaceURL}</value>
				<value>classpath:config/system.properties</value>
				<value>classpath:config/rediskey.properties</value>
			</list>
		</property>
	</bean>

</beans>
這樣寫的好處是:  這種擴充套件以後更靈活。 比如 properties中還有變數  ${}  這種是從 pom.xml 或者maven相關的變數讀取的話。 就必須自己擴充套件寫這個類了

第二種寫法:

寫一個param載入的監聽器,需要實現 ServletContextListener介面

程式碼如下

package com.jmt.webapp.listener;

import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * @Description:param載入監聽器
 * 
 * @author ZZK
 * @ date 2017年3月28日
 * title ParamLoadListener
 */

public class ParamLoadListener implements ServletContextListener {

	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		Properties props=new Properties();

		try{
			InputStream in=getClass().getClassLoader().getResourceAsStream("param.properties");//先獲取輸入流
			props.load(in);//載入流資訊
			//把獲取到的資訊設定進去
			sce.getServletContext().setAttribute("authInterval",props.getProperty("authInterval"));
			sce.getServletContext().setAttribute("host", props.getProperty("host"));
			sce.getServletContext().setAttribute("jghost", props.getProperty("jghost"));
			sce.getServletContext().setAttribute("authkey", props.getProperty("authkey"));
			sce.getServletContext().setAttribute("size", props.getProperty ("size"));
			sce.getServletContext().setAttribute("handler", props.getProperty ("handler"));
			sce.getServletContext().setAttribute("hostStarFace", props.getProperty ("hostStarFace"));
			sce.getServletContext().setAttribute("starFaceName", props.getProperty ("starFaceName"));
			sce.getServletContext().setAttribute("starFacePwd", props.getProperty ("starFacePwd"));
		}catch(Exception e){
			e.printStackTrace();
		}

	}

	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub

	}

}


這裡面,需要先通過流的方式把param.properties讀出來

  然後再載入資訊,  最後把屬性新增進去, 新增的資訊需要和properties裡的命對應。

這寫好後,就可以在web.xml裡配置監聽器了:

<!-- 過濾器配置 -->
	<!-- param.properties的配置過濾器 -->
	<listener>
		<listener-class>com.jmt.webapp.listener.ParamLoadListener</listener-class>
	</listener>


配置好以後,就可以重啟tomcat  然後調方法查看了

這樣就成功了,但是有一點不好的是:如果檔案裡的資訊多的話,需要配置的也多。

請大家根據自己的喜好,選擇運用哪種方式

相關推薦

如何配置獲取properties檔案資訊

在搭配框架的時候,大多數時候都是需要配置多個properties檔案, 那麼這個時候,如何配置並獲取檔案裡的內容呢? 第一種方法:寫一個類,繼承PropertyPlaceholderConfigurer ,然後啟動的時候就載入:程式碼如下 package com.cmos

Spring中配置和讀取Properties檔案--轉

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">       &

spring配置加載properties文件

lac 存在 cnblogs org bsp 讀取 ace val cati (一)首先,我們要先在spring配置文件中。定義一個專門讀取properties文件的類.例: 1 <bean id="propertyConfigurer" class="org.sp

android——CMakeList配置之編譯.cpp檔案

上次提到AndroidStudio2.2進行NDK開發超方便的配置方式,不用進行Android.mk 配置,也不用進行Application.mk配置,只要配置CMakeList即可。那麼問題來了,通過該方式生成的配置檔案預設是隻native-lib.cpp一個cpp檔案的,那麼怎麼配置編譯多個.c

linux cp查詢複製指定檔案到某個目錄

cat ~/RamDisk/filelist.txt | xargs -t -n1 -I{} cp {} ~/workspace/testdir/ srcfilelist.txt中儲存檔名列表(可以是\t或\n或空格等空白字元分隔),將這些檔案cp到~/workspac

CMakeList配置之編譯.cpp檔案

上次提到AndroidStudio2.2進行NDK開發超方便的配置方式,不用進行Android.mk 配置,也不用進行Application.mk配置,只要配置CMakeList即可。那麼問題來了,通過該方式生成的配置檔案預設是隻native-lib.cpp一個cpp檔案的

spring中載入.properties檔案的問題

spring中 context:property-placeholder 匯入多個獨立的 .properties配置檔案? Spring容器採用反射掃描的發現機制,在探測到Spring容器中有一個 org.springframework.beans.factory.co

jquery multiselect如何實現下拉框獲取選項的值

    今天做專案遇到了一個需要用多選框實現多選功能、並將多選框的值傳到後臺實現插入一張表的問題,最開始一直在想用複選框實現多選功能,後來發現做起來頁面不好看,最後在網上查資料,想找到一種方便使用的外掛,最後選擇了multiselect這個外掛。     首先簡單說下我要實

讀取Properties檔案

package net.hxtek.util; import java.io.IOException; /** * 讀取Properties檔案列舉類 * 2014-3-13 下午2:12:18 * */ public enum PropUtil { SMS("

spring引入properties檔案

在開發中常常把配置資訊放在properties檔案中,然後spring的xml中引入。如果在多個spring的xml檔案中引入properties <context:property-placeholder ignore-unresolvable="tru

KindEditor獲取textarea文本框的值判斷非空

div 編輯器 fill star fontsize 取值 pop 獲取 sta kindeditor官網:http://kindeditor.net/demo.php 如何獲取多個KindEditor中textarea文本框的值,方式很多種(帶有HTML標簽)。

jmeter 正則獲取返回token至本地文件,跨線程組調用

mage 表達 processor csv文件 參數 res 例如 通過 mark 1、打開jmeter,創建setup Thread Group對於setup Thread Group和tearDown Thread Group來說,從字面意思上來看就是安裝線程組和卸載線

JQuery 同時獲取標籤的指定內容儲存為陣列

文章來自:原始碼線上https://www.shengli.me/jquery/271.html       此時的list1的陣列中   每個元素已經不是'li'物件,如此執行控制檯會報錯: &nbs

log4j.xml 中配置輸出檔案

現在的專案中,對於日誌的配置,我們有時候需要配置對應不同的輸出日誌檔案,例如按照模組劃分,按照功能劃分,分別輸出到不同的日誌檔案中,下面介紹一下,怎麼配置不同的輸出日誌檔案。 下面是一整塊的log4j.xml配置。如果對怎麼配置spring 和 log4j不瞭解的話,可以參

classpath:和classpath*:的區別以及web.xml中配置xml檔案

首先我們都知道要使用spring,則需要在web.xml中增加如下程式碼:  Xml程式碼    <listener>  <listener-class>org.springframework.web.context.ContextLoaderList

spring裡配置屬性檔案與@Value

1,專案在spring裡配置多個屬性檔案: <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceho

shell指令碼-從ftp伺服器上下載zip檔案解壓

zip格式檔案用unzip filename解壓 get 下載單個檔案 mget 下載多個檔案 #!/bin/sh FTP_IP=192.168.25.100 #FTP伺服器地址 F

MapReduce案例9——數字檔案的資料排序新增序號(新增可並行方法)

題目:數字排序並加序號源資料: 2 32 654 32 15 756 65223 5956 22 650 92 26 54 6 最張結果: 1 2 2 6 3 15 4 22 5 26 6 32 7 32 8 54 9 92 10 650 11 654

spring boot 程式碼、註解配置獲取yml、properties檔案中的map即鍵值對

一、yml獲取自定義鍵值對 yml中的鍵值對 test: map: key1: value1 key2: value2 key3: value3 pom中的依賴配置 <dependency> <groupId>org.sprin

C# Directory.GetFiles()獲取型別格式的檔案

第一種方式 System.IO.Directory.GetFiles()獲取多個型別格式的檔案 System.IO.Directory.GetFiles("c:\","(*.exe|*.txt)");   第二種方式 var files = Directory.GetFi