Я расскажу немного о Spring и его файле applicationContext.xml, который внесет ясность в некоторые вещи, происходящие в синтаксисе SFig.
Файл applicationContext.xml используется для выражения инициализации bean-компонента для bean-компонентов, которые будут управляться фабрикой bean-компонентов Spring. Итак, учитывая пример bean-компонентов, которые я видел в моей SFig-версии этого файла, в коде Java-приложения можно было бы запросить фабрику bean-компонентов сделать экземпляр bean-компонента следующим образом:
SqlMapClient sqlMapClient = getBean("sqlMapClient");
Фабрика bean-компонентов заботится о любой реализации и инициализации, необходимых для bean-компонента, вплоть до внедрения зависимостей. В этом случае компоненту SqlMapClient требуется экземпляр компонента dataSource (который также описывается и упоминается в примере SFig).
Дескриптор бина передает следующую информацию фабрике бинов:
- имя Java-класса bean-компонента
- идентификатор компонента, по которому можно запросить или сослаться на него
- мета-атрибуты определения бина (необязательно)
- аргументы инициализации конструктора (необязательно)
- и / или инициализаторы свойств
'@' ставит префикс мета-атрибутов определения компонента. Это атрибуты, которые используются фабрикой компонентов для управления компонентом. Например, @scope = singleton сообщит фабрике бинов о создании единственного экземпляра бина, кеширует его и раздаст ссылки на него при запросе. Те, которые могут быть установлены, те же, что определены в Spring-Framework.
Если компонент должен быть инициализирован через конструктор, то это выражается в SFig синтаксисом, который, по-видимому, вызывает this с аргументами в скобках.
Или bean-компонент можно инициализировать, задав его свойства. Идентификаторы, которые назначены и не имеют префикса '@', являются свойствами bean-компонента.
При ссылке на bean-компонент, который является обязательной зависимостью, на него можно сослаться с префиксом его идентификатора компонента с помощью $. Несколько примеров этого появляются в примере SFig.
Символьная переменная $ {foo.bar}, появляющаяся в строковых литералах, будет заменена значением свойства Java. В этом случае свойства загружаются из файла application.properties через эту строку:
properties_include "classpath:application.properties";
Свойства Java-системы будут рассматриваться следующим, если они не найдены ни в одном из включенных свойств Это широко применяемая практика во многих Java-фреймворках. В текущем XML-файле applicationContext.xml есть способ разрешить это использование.
Поскольку java.util.Properties часто используются для инициализации bean-компонентов, SFig предоставляет PROPERTIES в качестве специального удобного синтаксиса для объявления объекта Properties. Аналогично для java.util.List, который имеет соответствующий SFig LIST. Кроме того, массивы значений могут быть объявлены в квадратных скобках [...].
Дополнительно есть TEXT для объявления блоков многострочного текста. '@' - префикс строкового литерала означает отключение escape-кодирования - синтаксис языка заимствован из C #.
Одной из основных целей проектирования SFig DSL является сохранение декларативного характера. Я намеренно воздерживаюсь от добавления каких-либо обязательных функций сценариев. Сложность логики программирования, встроенной в текстовый файл конфигурации, предполагает возможность его отладки. Не хочу открывать еще одно измерение отладки кода.