Trong bài viết trước, mình đã giới thiệu với các bạn cách làm việc với tập tin .properties sử dụng class Properties. Có những nhu cầu liên quan đến cấu hình thông tin của ứng dụng khác mà class Properties này không hỗ trợ, ví dụ như:
Không hỗ trợ việc sử dụng lại property đã được khai báo trong các properties khác.
Giả sử mình có các properties sau:
1 2 3 |
huongdanjava.base.url=https://huongdanjava.com huongdanjava.contact.url=https://huongdanjava.com/vi/lien-he huongdanjava.introduction.url=https://huongdanjava.com/vi/gioi-thieu |
Vì các properties này có giá trị giống nhau ở đầu, nên mình sẽ có nhu cầu được sử dụng lại property “huongdanjava.base.url” trong các properties khác sử dụng variable interpolation với syntax “${<property_name>}” như sau:
1 2 3 |
huongdanjava.base.url=https://huongdanjava.com huongdanjava.contact.url=${huongdanjava.base.url}/vi/lien-he huongdanjava.introduction.url=${huongdanjava.base.url}/vi/gioi-thieu |
để khi mình thay đổi thông tin của base url, mình chỉ cần thay đổi property “huongdanjava.base.url” là được.
Lấy thông tin cấu hình từ biến môi trường
Khi chạy ứng dụng, đôi lúc chúng ta sẽ cần lấy giá trị của một biến môi trường để inject vào thông tin cấu hình của ứng dụng. Như ví dụ trên, nếu giá trị của property “huongdanjava.base.url” giờ mình ko cấu hình trực tiếp vào tập tin .properties mà sẽ lấy từ biến môi trường “HUONGDANJAVA_BASE_URL” thì sẽ làm như thế nào? Mặc định thì class Properties không hỗ trợ rồi.
Tất cả những vấn đề trên, các bạn có thể dễ dàng giải quyết nếu sử dụng Apache Common Configuration.
Cụ thể như thế nào? Chúng ta sẽ cùng nhau tìm hiểu trong bài viết này các bạn nhé!
Mình sẽ tạo một Maven project để làm ví dụ:
với Apache Common Configuration dependency được khai báo như sau:
1 2 3 4 5 6 7 8 9 10 |
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-configuration2</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency> |
Mình sẽ đọc tập tin config.properties nằm trong thư mục src/main/resources với nội dung như sau:
1 2 3 |
huongdanjava.base.url=https://huongdanjava.com huongdanjava.contact.url=${huongdanjava.base.url}/vi/lien-he huongdanjava.introduction.url=${huongdanjava.base.url}/vi/gioi-thieu |
Nếu sử dụng class Properties thì các bạn sẽ thấy kết quả như sau khi đọc property “huongdanjava.contact.url”:
Giá trị của property “huongdanjava.base.url” đã không được replace trong chuỗi giá trị của property “huongdanjava.contact.url” như các bạn thấy!
Bây giờ, chúng ta sẽ sử dụng Apache Common Configuration để giải quyết vấn đề này các bạn nhé!
Trong Apache Common Configuration thì interface Configuration giúp chúng ta làm việc với tất cả các loại cấu hình mà ứng dụng của chúng ta cần. Cho tập tin .properties thì chúng ta sẽ sử dụng implementation của interface Configuration này PropertiesConfiguration.
Để đọc nội dung của tập tin .properties với Apache Common Configuration, chúng ta sẽ sử dụng class FileBasedConfigurationBuilder với tham số là class PropertiesConfiguration như sau:
1 |
FileBasedConfigurationBuilder<FileBasedConfiguration> builder = new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class); |
Các bạn cần chỉ định tập tin .properties cần đọc sử dụng phương thức configure() như sau:
1 2 |
Parameters parameters = new Parameters(); builder.configure(parameters.properties().setFile(path.toFile())); |
Bây giờ thì chúng ta có thể lấy đối tượng của class Configuration từ class builder trên rồi:
1 |
Configuration configuration = builder.getConfiguration(); |
Các bạn có thể lấy đối tượng của class Properties từ đối tượng Configuration này như sau:
1 |
Properties properties = ConfigurationConverter.getProperties(configuration); |
Giờ thì chúng ta có thể lấy thông tin trong tập tin .properties sử dụng đối tượng Properties này rồi.
Các bạn sẽ thấy kết quả như sau:
khi lấy giá trị của property “huongdanjava.contact.url”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package com.huongdanjava.commonconfiguration; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Properties; import org.apache.commons.configuration2.Configuration; import org.apache.commons.configuration2.ConfigurationConverter; import org.apache.commons.configuration2.FileBasedConfiguration; import org.apache.commons.configuration2.PropertiesConfiguration; import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; import org.apache.commons.configuration2.builder.fluent.Parameters; import org.apache.commons.configuration2.ex.ConfigurationException; public class Application { public static void main(String[] args) throws ConfigurationException { Path path = Paths.get("src", "main", "resources", "config.properties"); FileBasedConfigurationBuilder<FileBasedConfiguration> builder = new FileBasedConfigurationBuilder<>( PropertiesConfiguration.class); Parameters parameters = new Parameters(); builder.configure(parameters.properties().setFile(path.toFile())); Configuration configuration = builder.getConfiguration(); Properties properties = ConfigurationConverter.getProperties(configuration); System.out.println(properties.getProperty("huongdanjava.contact.url")); } } |
Như vậy thì giá trị của property “huongdanjava.base.url” đã được thay thế trong giá trị của property “huongdanjava.contact.url” rồi đó các bạn!
Để lấy thông tin cấu hình được cấu hình trong biến môi trường, các bạn có thể khai báo biến môi trường sử dụng variable interpolation bắt đầu với từ khoá “env:” như sau:
1 2 3 |
huongdanjava.base.url=${env:HUONGDANJAVA_BASE_URL} huongdanjava.contact.url=${huongdanjava.base.url}/vi/lien-he huongdanjava.introduction.url=${huongdanjava.base.url}/vi/gioi-thieu |
Lúc này, nếu lấy giá trị của property “huongdanjava.introduction.url”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package com.huongdanjava.commonconfiguration; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Properties; import org.apache.commons.configuration2.Configuration; import org.apache.commons.configuration2.ConfigurationConverter; import org.apache.commons.configuration2.FileBasedConfiguration; import org.apache.commons.configuration2.PropertiesConfiguration; import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; import org.apache.commons.configuration2.builder.fluent.Parameters; import org.apache.commons.configuration2.ex.ConfigurationException; public class Application { public static void main(String[] args) throws ConfigurationException { Path path = Paths.get("src", "main", "resources", "config.properties"); FileBasedConfigurationBuilder<FileBasedConfiguration> builder = new FileBasedConfigurationBuilder<>( PropertiesConfiguration.class); Parameters parameters = new Parameters(); builder.configure(parameters.properties().setFile(path.toFile())); Configuration configuration = builder.getConfiguration(); Properties properties = ConfigurationConverter.getProperties(configuration); System.out.println(properties.getProperty("huongdanjava.introduction.url")); } } |
các bạn sẽ thấy kết quả như chúng ta mong muốn như sau:
với biến môi trường HUONGDANJAVA_BASE_URL được cấu hình khi chạy ứng dụng ví dụ như sau:
Như vậy, với Apache Common Configuration, chúng ta đã giải quyết được những hạn chế của class Properties của Java rồi đó các bạn!