Cfg

Связи
  • jandcode.core (module)
  • jandcode.core.std.CfgService (class)
  • jandcode.core.std.Cfg (class)

Введение

Полная конфигурация приложения загружается из 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()