Spring Fu 0.3.0 и не только

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Для будущих учащихся на курсе "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»

Источник: https://habr.com/ru/company/otus/blog/555292/


Интересные статьи

Интересные статьи

В этом посте мы рассмотрим, как Spring Data Jdbc строит sql-запросы для извлечения связных сущностей. Пост рассчитан на начинающих программистов и не содержит каких-то супер хитрых веще...
Вячеслав Ермолин — 5 сентября 2020Результаты пусковых программ за 8 месяцев 2020 года. Читать далее
Недавно столкнулся с проблемой: все приложения используют Telegram-бота в качестве подтверждения входа в аккаунт, а мое — нет. Я был настроен серьезно и провёл уйму времени в интернет...
Привет, Хабр! Представляю вашему вниманию перевод статьи «f5 Reasons AI Won’t Replace Humans… It Will Make Us Superhuman». Многие говорят, что ИИ с немыслимой скоростью забирает у нас работу. ...
Как-то у нас исторически сложилось, что Менеджеры сидят в Битрикс КП, а Разработчики в Jira. Менеджеры привыкли ставить и решать задачи через КП, Разработчики — через Джиру.