English documentation is available here
Данный плагин позволяет удобно использовать конфигурационные данные (как правило из файла Config.groovy
) в бинах Spring'а (сервисах, контроллерах, taglib'ах и т.д.).
Рассмотрим, как это можно было сделать раньше:
import javax.annotation.PostConstruct
class MyService {
def grailsApplication
private myVariable
@PostConstruct
private setUp() {
myVariable = grailsApplication.config.app.myVariable
}
void doSomeCoolStuff() {
println myVariable
}
}
Подход неплохой, но зачем внедрять бин grailsApplication
только для того, чтобы получить конфигурационное значение? Давайте чуть-чуть улучшим данный код:
import grails.util.Holders
import javax.annotation.PostConstruct
class MyService {
private myVariable
@PostConstruct
private setUp() {
myVariable = Holders.config.app.myVariable
}
void doSomeCoolStuff() {
println myVariable
}
}
Уже лучше. Но можно сделать данный код еще короче...
Посмотрите как просто получить конфигурационное значение, используя плагин Grails Config Annotation:
import ru.grails.config.GrailsConfig
class MyService {
@GrailsConfig("app.myVariable")
private myVariable
void doSomeCoolStuff() {
println myVariable
}
}
Все очень просто:
- Импортируем аннотацию:
import ru.grails.config.GrailsConfig
- Добавляем аннотацию к переменной. В значении аннотации указываем имя переменной, которую необходимо получить из файла
Config.groovy
(в нашем случаеapp.myVariable
):@GrailsConfig("app.myVariable")
.
Вы можете указать значение по-умолчанию для переменной. Если в файле Config.groovy
требуемая конфигурационная переменная не найдена, то будет использовано значение по-умолчанию. Для этого в значении аннотации добавьте :
, а затем значение по-умолчанию. Например:
import ru.grails.config.GrailsConfig
class MyService {
@GrailsConfig("app.myVariable:my default value")
private myVariable
void doSomeCoolStuff() {
println myVariable
}
}
Если в файле Config.groovy
переменная app.myVariable
найдена не будет, то для переменной myVariable
будет использовано значение my default value
.
Если аннотация @GrailsConfig
не определяет значение по-умолчанию, то будет использовано значение, определяемое классом. Например:
import ru.grails.config.GrailsConfig
class MyService {
@GrailsConfig("app.myDelay")
private Long myDelay = 5000
void doSomeCoolStuff() {
sleep(myDelay)
}
}
Если в файлеConfig.groovy
переменная app.myDelay
не определена, то для переменной myDelay
будет использовано значение 5000
.
Вы можете явно указать тип переменной. В этом случае конфигурационное значение будет преобразовано к требуемому типу, например:
import ru.grails.config.GrailsConfig
class MyService {
@GrailsConfig("app.myVariable:-1")
private Integer myVariable
void doSomeCoolStuff() {
println myVariable
}
}
В данном примере значение конфигурационной переменной app.myVariable
или значение по-умолчанию -1
будет преобразовано к типу Integer
.
Плагин полностью поддерживает разработку с включенной перегрузкой кода (grails run-app
) - значения конфигурационных переменных должно обновляться, как это и ожидается. Это включает в себя ситуации:
- Добавление/удаление переменной
- Изменение значения переменной в файле
Config.groovy
- Изменение значения аннотации
@GrailsConfig
Не используйте аннотацию @GrailsConfig
с контроллерами Grails! По умолчанию объект контроллера в Grails создается на каждый запрос (prototype
scope).
Таким образом, аннотация @GrailsConfig
будет неоправданно тратить ресурсы, отрабатывая при каждом запросе. Вы можете решить эту проблему одним из двух способов:
- Поменять scope вашего контроллера на
singleton
- Или же перенести аннотацию
@GrailsConfig
в сервис (которые по-умолчанию имеютsingleton
scope)
Если у вас какие-либо проблемы с плагином или есть предложения по усовершенствованию, пожалуйста, сообщите мне - буду рад ответить.
Данный плагин добавляет в Grails функциональность очень похожу на аннотацию @Value
в Spring. Помните, что аннотация @GrailsConfig
работает только в бинах Spring'а (контроллеры, сервисы, tagLib'ы и т.д.).