Java Properties trong Java với Apacha Commons Configuration

Chào mừng các bạn đã quay trở lại với thachleblog, bài viết hôm nay mình sẽ giới thiệu với các bạn về Java  Properties. Hy vọng qua bài viết này các bạn sẽ biết được lợi ích của Properties cũng như cách sử dụng tính năng này. Mình cũng sẽ giới thiệu đến các bạn library mà mình rất hay dùng là Apache Commons Configuration, rất hữu ích. Nào chúng ta cùng bắt đầu nhé.

Giới thiệu

Java Properties nằm trong packet java.util.Properties, dùng để lưu trữ data configuration của project Java. Chúng ta thường thấy trong các source deploy của các project  luôn có các file .properties để lưu cấu hình cài đặt, thông tin cho project.

Lợi ích

Ở bài trước, mình đã giới thiệu về static variables dùng để định nghĩa thông tin, cấu hình cho project trong Java. Nhược điểm của cách dùng này là mỗi lần update thông tin, chúng ta cần phải build lại source code và deploy lại project. Đối với sử dụng file config, ta có thể dễ dàng update thông tin trên file config và chỉ cần restart lại project là được. Không cần phải sửa và build lại source code.

Implement

Đối với cách dùng Java Properties, các bạn có thể xem examples của anh mkyong tại đây. Mình cực thích các bài viết của anh này, rất đơn giản và dễ hiểu. Tuy nhiên ở bài viết này, mình sẽ giới thiệu các bạn library Apache Commons Configuration, là gói enhance của Java Properties. Các bạn có thể xem giới thiệu về ACC tại đây.

Mình đã từng gặp vấn đề là muốn file config rõ ràng hơn các mục nên sẽ có mục section và info.

Ví dụ:

[section1]
info1 = value1
info2 = value2
 
[section2]
info1 = value1
info2 = value2

Apache Commons Configuration hỗ trợ hierarchy (thứ bậc) đối với dạng file .ini và xml với key là section1.info1 hoặc section2.info1 (sẽ rõ hơn ở phần ví dụ). Tuy nhiên đối với file properties ta cũng có thể sử dụng hierarchy để phân biệt bằng cách sử dụng file config:

section1.info1 = value1
section1.info2 = value2 
 
section2.info1 = value1 
section2.info2 = value2

Code demo:

Để sử dụng Apache Commons Configuration chúng ta cần import library apache commons configuration và các dependencies của nó gồm commons collection, commons logging và commons lang. ở demo này mình dùng phiên bản 1.x.

File ini:

[sql]
host = localhost
port = 8088
username = admin
passoword = admin
 
[account]
username = thachlp
password = thachlp

File properties
#sql
sql.host = localhost
sql.port = 8088
sql.username = admin
sql.passoword = admin
 
# account
account.username = admin
account.password = admin

Đọc file properties và ini

package thach.le;
import java.io.File;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.configuration.HierarchicalINIConfiguration;
import org.apache.commons.configuration.PropertiesConfiguration;
 
/**
 *
 * @author thachlp
 */
public class Config {
 
	private static CompositeConfiguration configProperties = null;
	private static CompositeConfiguration configIni = null;
	private static ConcurrentHashMap<String, String> hashConfig = null;
 
	static {
		init();
	}
 
	private static synchronized void init() {
 
		String iniFile = "conf/application.ini";
		String propertyFile = "conf/application.properties";
 
		configProperties = new CompositeConfiguration();
		configIni = new CompositeConfiguration();
		hashConfig = new ConcurrentHashMap();
		try {
			configProperties.addConfiguration(new PropertiesConfiguration(propertyFile));
			configIni.addConfiguration(new HierarchicalINIConfiguration(iniFile));
		} catch (ConfigurationException ex) {
			System.err.println("Please check file path");
		}
	}
 
	// Read value from properties file
	public static String getParamProPerties(String name) {
		if (hashConfig.contains(name)) {
			return (String) hashConfig.get(name);
		}
		String value = configProperties.getString(name);
		if (value != null) {
			hashConfig.put(name, value);
		}
		return value;
	}
	// Read value from ini file
	public static String getParamIni(String section, String name) {
		String key = section + "." + name;
		if (hashConfig.contains(key)) {
			return (String) hashConfig.get(key);
		}
		String value = configIni.getString(section + "." + name);
		if (value != null) {
			hashConfig.put(key, value);
		}
		return value;
	}
}

Test kết quả

package thach.le;
 
/**
 *
 * @author thachlp
 */
public class Main {
	public static void main(String[] args) {
		//Test properties
		String userNameProperties = Config.getParamProPerties("account.username");
		String passWordProperties = Config.getParamProPerties("account.password");
		String hostProperties = Config.getParamProPerties("sql.host");
		String portProperties = Config.getParamProPerties("sql.port");
 
		//Test ini
		String userNameIni = Config.getParamIni("account", "username");
		String passWordIni = Config.getParamIni("account", "password");
		String hostIni = Config.getParamIni("sql", "host");
		String portIni = Config.getParamIni("sql", "port");
 
		System.out.println("Read from properties file: " + userNameProperties);
		System.out.println("Read from properties file: " + passWordProperties);
		System.out.println("Read from properties file: " + hostProperties);
		System.out.println("Read from properties file: " + portProperties);
 
		System.out.println("Read from ini file: " + userNameIni);
		System.out.println("Read from ini file: " + passWordIni);
		System.out.println("Read from ini file: " + hostIni);
		System.out.println("Read from ini file: " + portIni);
 
	}
 
}

Kết quả:

Java Properties trong Java với Apacha Commons Configuration

Vừa rồi là phần giới thiệu về Java Properties và demo về cách sử dụng Apache Common Configuration. Mọi đóng góp và nhận xét xin vui lòng comment bên dưới. Xin cảm ơn và hẹn gặp lại các bạn ở các bài viết sau…

Tham gia bình luận