Cfg
Введение
Полная конфигурация приложения загружается из app.cfx
и доступна в приложении через
метод App#getConf()
. Она включает в себя все, что нужно для приложения, включая
внутренние (системные) настройки. Эти настройки критичны для работы.
Однако при установке/настройке приложения необходимо вносить изменения в конфигурацию, например настраивать соединения с базой данных.
Для обеспечения более безопасной модификации настроек вводится соглашение:
все параметры приложения, которые можно моифицировать при установке/запуске, хранятся в
узле cfg
.
Например:
<root>
<cfg>
<section1 param1="1" param2="2"/>
<section2>
<section3 param3="3"/>
</section2>
</cfg>
</root>
Доступ к этой конфигурации должен осуществлятся через сервис
jandcode.core.std.CfgService
:
// получаем сервис cfg
CfgService cfgSvc = getApp().bean(CfgService.class)
// получаем конфигурацию
Conf cfgConf = cfgSvc.getConf()
// пользуемся
String param1 = cfgConf.getString("section1/param1")
String param3 = cfgConf.getString("section2/section3/param3")
Подстановки
В значениях параметров конфигурации можно использовать подстановки ${PATH}
, где PATH
-
путь значения внутри узла cfg
.
Например:
<root>
<cfg>
<section1 param1="1" param2="2"/>
<section2>
<section3 param3="3-${section1/param2}-${section1/param1}"/>
</section2>
</cfg>
</root>
Получаем:
CfgService cfgSvc = getApp().bean(CfgService.class)
String param3 = cfgSvc.getConf().getString("section2/section3/param3")
// param3="3-2-1"
Игнорирование подстановок
Для некоторых параметров может понадобиться игнорировать подстановки, т.к. их обработкой может заниматься кто-то другой и по особым правилам.
Для этого необходима такая настройка:
<root>
<bean name="jandcode.core.std.CfgService">
<expand-rule
name="NAME"
mask="MASK"
ignore="true"/>
</bean>
</root>
Где:
name
- призвольное имяmask
- маска пути внутриcfg
, где подстановки игнорируются, напримерdbsource/**/*
Типизированный доступ к конфигурации
Частенько удобнее получать значения параметров конфигурации не напрямую, через
getConf()
с указанием пути, а через некий типизированный интерфейс. Такой интерфейс
упрощает работу со сложноорганизованными параметрами.
Для этого необходимо создать интерфейс, унаследовав его от
jandcode.core.std.Cfg
, и описать методы, через которые будет осуществлятся доступ к
параметрам. Затем реализовать его и зарегистрировать реализацию в качестве бина
приложения.
Пример реализации:
import jandcode.core.std.*
/**
* Моя конфигурация
*/
interface MyCfg extends Cfg {
/**
* Базовый url
*/
String getBaseUrl();
}
class MyCfgImpl extends BaseCfg implements MyCfg {
String getBaseUrl() {
return getConf().getString("url/base", "http://host:8080")
}
}
Пример регистрации:
<root>
<bean name="pak1.pak2.MyCfg"
class="pak1.pak2.MyCfgImpl"/>
</root>
Пример использования:
MyCfg myCfg = getApp().bean(MyCfg.class)
String baseUrl = myCfg.getBaseUrl()