25 октября 2012 г.

Хранение настроек в property-файлах

В любом приложении всегда есть неизменяемые значения: путь до какой-либо директории, максимальное время установления соединения, адрес базы данных, количество попыток переподключения и т.п. Такие значения рекомендуется делать хотя бы статичными полями класса (три модификатора private static final). Это вам пригодится на тот случай, если казавшиеся ранее неизменяемыми параметры внезапно изменятся. Например, в БД на продакшене таблицы имеют другой префикс. И если имена таблиц вынесены как статичные поля в начале класса, то не нужно искать все вхождения имени таблицы. Достаточно просто отредактировать значения этих полей, запустить сборку - и приложение снова работает!

Давайте пойдём дальше и сделаем так, чтобы можно было изменять параметры без редактирования исходного кода и последующей его компиляции. В Java нам на помощь придёт стандартный класс Properties. У него есть методы, позволяющие загрузить значения параметров из файла конфигурации. Обычно этот файл имеет расширение .properties и хранится внутри jar-архива. Хотя это и не обязательно. Формат этого файла может быть как простой текстовый ("ключ=значение"), так и xml.

В качестве ключа выбирают текст, состоящий из латинских букв и цифр. Этот ключ пишется только строчными буквами и, если он содержит пробелы, то пробелы заменяют на точки.

Если значение содержит текстовую строку с пробелами, то эта строка заключается в кавычки. Пример файла свойств в простом текстовом формате:
page.file.name = index.html
page.title = "Page Second Name"
Пример файла свойств в формате xml (обратите внимание, что тут уже не нужно заключать значение с пробелами в кавычки):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="page.file.name">index.html</entry>
<entry key="page.title">Page Second Name</entry>
</properties>
Загрузка свойств может быть произведена в любое время при помощи следующего кода:
Properties properties = new Properties();
properties.load(this.getClass().getResourceAsStream("/META-INF/deploy.properties"));
datasourceLookup = properties.getProperty("datasource.lookup");
Здесь путь к файлу со свойствами указан от корневой директории внутри jar-файла. Значение свойства получаем по его имени в файле (возвращается тип String) и присваиваем статичному полю класса.

Если мы используем файл свойств в формате xml, нужно использовать метод loadFromXml().

Чтобы вывести все свойства, загруженные в объект properties, нам пригодится метод properties.entrySet(), вызванный в цикле for. Однако порядок следования параметров не обязательно будет таким же, как и в файле. Поэтому сортировку нужно будет сделать дополнительно.

В общем, всегда выносите константы в виде параметров в отдельные файлы, ведь в один прекрасный день может потребоваться изменить их значение.

Комментариев нет:

Отправить комментарий