Для будущих учащихся на курсе "Kotlin Backend Developer" подготовили перевод материала.
Также приглашаем всех желающих на открытый демо-урок «Использование GraphQL в разработке бэкенд на Kotlin». На этом вебинаре проведем обзор технологии GraphQL, рассмотрим существующие решения для Kotlin и примеры серверной и клиентской реализации с ktor и graphql-kotlin.
Спешу поделиться радостной новостью — наконец-то вышел Spring Fu версии 0.3.0. Напомню, что это инкубатор для программного конфигурирования Spring Boot с использованием DSL. Он позволяет декларативно задавать конфигурацию в самом коде, предлагая отличную обнаруживаемость посредством автозавершения.
JaFu возвращается!
Теперь мы снова можем использовать JaFu (DSL Java) наряду с KoFu (DSL Kotlin). Я отказался от JaFu в версии 0.1.0, потому что на тот момент мне не хватало ресурсов для поддержки двух DSL — Java и Kotlin. Что касается API, я не был уверен, что вариант на Java стоил моих усилий, но я передумал по нескольким причинам:
Многие пользователи просили вернуть его.
Java быстро развивается.
JaFu позволяет лучше контролировать применение конфигурации, что делает его полезным не только для Java-разработчиков, но и для Kotlin-разработчиков.
Функциональный подход очень эффективен при работе с JVM и нативными образами GraalVM.
К нашей команде присоединились два новых специалиста: Одри Неве (Audrey Neveu) работает над KoFu, а Арьен Путсма (Arjen Poutsma) — над JaFu. Добро пожаловать!
Другие улучшения
С выходом новой версии появилась возможность создать базовую линию Spring Boot 2.3.0 и улучшить API. Подробнее об изменениях написано тут.
Благодаря дополнительной оптимизации Spring Fu 0.3.0 позволяет использовать только функциональную веб-инфраструктуру, поэтому на моем ноутбуке OpenJDK 11 запускается очень быстро: Started Application in 0.673 seconds (JVM running for 0.898).
Сравнение JaFu и Kofu
Spring MVC позволяет использовать функциональный подход как для Java, так и для Kotlin. Давайте посмотрим, как выглядит самое простое веб-приложение Spring Boot, созданное с помощью этих DSL.
На JaFu:
public class Application {
public static JafuApplication app = webApplication(a -> a.beans(b -> b
.bean(SampleHandler.class)
.bean(SampleService.class))
.enable(webMvc(w -> w
.port(w.profiles().contains("test") ? 8181 : 8080)
.router(router -> {
SampleHandler handler = w.ref(SampleHandler.class);
router
.GET("/", handler::hello)
.GET("/api", handler::json);
}).converters(c -> c
.string()
.jackson(j -> j.indentOutput(true))))));
public static void main (String[] args) {
app.run(args);
}
}
На KoFu:
val app = webApplication {
beans {
bean<SampleService>()
bean<SampleHandler>()
}
webMvc {
port = if (profiles.contains("test")) 8181 else 8080
router {
val handler = ref<SampleHandler>()
GET("/", handler::hello)
GET("/api", handler::json)
}
converters {
string()
jackson {
indentOutput = false
}
}
}
}
fun main() {
app.run()
}
Срезы конфигурации
Вся прелесть этого подхода заключается в том, что вы можете определить собственные срезы конфигурации и собрать их как угодно. Для примера выделим три среза конфигурации webConfig
, loggingConfig
и myFeatureConfig
:
val webConfig = configuration {
webMvc {
// ...
}
}
val loggingConfig = configuration {
logging {
level = LogLevel.WARN
}
}
val myFeatureConfig = configuration {
beans {
// ...
}
cassandra {
// ...
}
}
В дальнейшем вы можете использовать их все в обычном веб-приложении:
val webApp = webApplication {
enable(loggingConfig)
enable(myFeatureConfig)
enable(webConfig)
}
fun main() {
webApp.run()
}
Для интеграционного тестирования можно использовать часть из них:
@Test
fun `My feature integration test`() {
val testApp = application {
enable(loggingConfig)
enable(myFeatureConfig)
}
// ...
}
Планы на будущее
В версии 0.4.0 мы планируем следующие нововведения:
Замена модуля autoconfigure-adapter на spring-init — экспериментальный проект, авторами которого являются Дейв Сиер (Dave Syer) и Энди Клемент (Andy Clement). Этот модуль автоматически трансформирует автоконфигурации Spring Boot в функциональную регистрацию бинов.
Нативная поддержка GraalVM без настройки рефлексии (зависит от oracle/graal#2500).
Новые расширенные возможности DSL.
Модель приложения, которое может масштабироваться до нуля с помощью JaFu, нативного образа GraalVM и Knative.
Реализация Spring Framework 5.3 M1, позволяющая отключить по умолчанию поддержку XML и SpEL.
Поддержка Spring Security через официальный DSL Kotlin Spring Security 5.3.
Будем рады вашим отзывам. Стоит отметить, что сейчас мы занимаемся в основном дизайном и API наших программ и не стремимся внедрить много новых функций.
Узнать подробнее о курсе "Kotlin Backend Developer"
Смотреть вебинар «Использование GraphQL в разработке бэкенд на Kotlin»