Spring АйО
8.43K subscribers
304 photos
209 videos
403 links
Русскоязычное сообщество Spring-разработчиков.

Habr: bit.ly/433IK46
YouTube: bit.ly/4h3Ci0x
VK: bit.ly/4hF0OG8
Rutube: bit.ly/4b4UeX6
Яндекс Музыка: bit.ly/3EIizWy

Канал для общения: @spring_aio_chat
Download Telegram
🧠 AI-ассистент с помощью Spring AI

Команда Spring АйО перевела туториал, в котором рассматриваются возможности Spring AI для интеграции с LLM.

Вы узнаете, как использовать API Function Calling для выполнения задач на естественном языке, генерировать ответы в JSON-формате и сохранять контекст диалога.

📚 Читайте на Хабре: https://habr.com/ru/companies/spring_aio/articles/869080/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥104
🏁 Как жить без IntelliJ IDEA? Часть 5. Заключение

В предыдущей статье "Как жить без IntelliJ IDEA" мы рассмотрели, есть ли альтернативы полюбившейся многим возможностям Ultimate общаться с базой данных через удобный UI прямо в среде разработки.

Наступил конец года и вместе с ним завершается наш цикл статей. Давайте коротко перечислим итоги каждой части, посмотрим, что мы пропустили, а также попробуем представить, как бы выглядело идеальное решение.

📚 Читать на Хабре: https://habr.com/ru/companies/spring_aio/articles/869354/
👍18🔥65👎1
👩‍💻 JEP 485: Stream Gatherers

С выходом JDK 24 Stream API станет еще мощнее благодаря новому инструменту — Stream Gatherers. Этот подход позволит разработчикам создавать собственные промежуточные операции в потоках, повышая гибкость и выразительность программного кода.

Почему это важно?

До сих пор Stream API предлагал фиксированный набор операций, таких как map, filter, distinct, и другие. Однако некоторые задачи не могли быть легко решены встроенными методами. Например, если вы хотите выделить уникальные строки на основе их длины, это требовало сложных обходных путей:


record DistinctByLength(String str) {
@Override public boolean equals(Object obj) {
return obj instanceof DistinctByLength other && str.length() == other.str.length();
}
@Override public int hashCode() {
return str.length();
}
}

var result = Stream.of("foo", "bar", "baz", "quux")
.map(DistinctByLength::new)
.distinct()
.map(DistinctByLength::str)
.toList();

// result ==> [foo, quux]


С выходом фичи задача будет решаться гораздо проще:


var result = Stream.of("foo", "bar", "baz", "quux")
.gather(Gatherers.distinctBy(String::length))
.toList();

// result ==> [foo, quux]


Как работает Gatherer?

Gatherer — это интерфейс, задающий логику преобразования элементов потока. Его работа строится на четырех функциях:

1. initializer — создает объект для хранения состояния.
2. integrator — обрабатывает элементы потока, при необходимости записывая данные в состояние.
3. combiner — объединяет результаты для параллельных потоков.
4. finisher — выполняет финальные действия, такие как добавление оставшихся данных.

Например, gatherer windowFixed группирует элементы в списки фиксированного размера:


Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
.gather(Gatherers.windowFixed(3))
.toList();

// result ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]


Что это дает разработчику?

1. Гибкость: Возможность определять операции любой сложности.
2. Параллельность: Поддержка многопоточности при использовании combiner.
3. Снижение сложности: Простое выражение сложных операций без использования обходных решений.
4. Поддержка Stateful Stream Processing подхода

Заключение

JEP 485 — это достойный вклад в развитие Stream API, предоставляющий разработчикам инструменты для создания более выразительных и производительных потоков.

🔗 С полным описанием JEP можно ознакомиться по ссылке: https://openjdk.org/jeps/485

#Java #JEP
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62👍217🤔62👎1
Forwarded from Amplicode (Aleksandr)
📊 Экосистема Spring в 2023/2024 годах

Каждый год мы проводим анализ использования технологий, связанных с экосистемой Spring.

Краткие результаты 2024 года в сравнении с прошлым годом:

1) Десять наиболее популярных технологий 2023 года остались в топе и в 2024 году.
2) Количество проектов на Spring Boot выросло в 2 раза. С бóльшей долей вероятности это связано с растущей популярностью Spring Boot.
3) Облачные технологии всё также продолжают набирать обороты в своей популярности.
4) Наблюдается явный рост использования микросервисных архитектур.
5) Рост Spring Data JDBC. Объяснить это можно несколькими причинами, но основная - стремление к упрощению небольших проектов в связи с высоким порогом входа в Hibernate, а также высокой ценой поддержки таких проектов.
6) Заметное развитие AI-технологий наподобие Spring AI. Точные цифры приведём уже в следующем году, ввиду новизны данных технологий.

Все данные были получены путем анализа зависимостей, используемых в проектах на GitHub.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍136
🍃 Дорогие участники сообщества Spring АйО!

Вместе мы выросли до сообщества, объединяющего более 5000 Spring-разработчиков! Ваша активность, поддержка и интерес к нашему контенту вдохновляют нас двигаться дальше.

В 2025 году мы приготовили для вас не менее амбициозные планы. Мы продолжим делиться с вами полезными материалами, обсуждать актуальные темы и развивать наше сообщество, чтобы каждому из вас было интересно и полезно быть частью этого движения.

Спасибо, что выбираете нас! Вместе мы сможем ещё больше. 🎄
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍6431🔥226
🗓 Еженедельный дайджест №27

Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!

🍃 Spring АйО

AI-ассистент с помощью Spring AI
Как жить без IntelliJ IDEA? Часть 5. Заключение
JEP 485: Stream Gatherers
Итоги 2024 года

⭐️ Партнёры

Исследование от Amplicode: Экосистема Spring в 2023/2024 годах
Joker опубликовал выступления блока «Language Features» с Joker 2024

😌 @spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥74
Media is too big
VIEW IN TELEGRAM
🎄 Дорогие участники сообщества Spring АйО!

Совсем скоро наступит 2025 год! По этому поводу эксперты сообщества подготовили для Вас небольшое видео-поздравление. Желаем приятного просмотра 🥳

С Новым годом, друзья! 🎄
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥75👍21133🤩1
🔥 У WireMock теперь есть официальная интеграция со Spring Boot!

В конце прошлого года у WireMock появилась официальная интеграция со Spring Boot. WireMock — один из самых популярных инструментов для имитации HTTP API в разработке и тестировании. Но раньше его использование в Spring Boot проектах требовало дополнительных усилий: разработчики вручную настраивали мок-серверы, писали повторяющийся код и работали с фиксированными портами. Это особенно усложняло работу в динамических или контейнеризованных средах.

Ключевые преимущества, которые получат разработчики благодаря интеграции со Spring Boot:

1. Поддержка WireMock с Jetty 12. Появилась поддержка сборки WireMock на базе Jetty 12. Теперь используется компактный JAR-файл jetty12 вместо более крупного standalone JAR. Это особенно полезно для команд, которые стремятся минимизировать размер загружаемых зависимостей.

2. Аннотации для настройки WireMock в тестах. Теперь можно создавать и настраивать экземпляры WireMock с помощью аннотаций. Например, можно определить экземпляр WireMock в тестовом классе следующим образом:


@SpringBootTest(classes = MyAppConfiguration.class)
@EnableWireMock
class MyTest {

@InjectWireMock
private WireMockServer wm;

// тесты
}


Всего несколько строк кода — и интеграция автоматически создаст мок-сервер, настроит его и возьмёт на себя управление его жизненным циклом.

3. Поддержка Extension Factories через аннотации конфигурации. Благодаря этому нововведению процесс подключения расширений WireMock, таких как gRPC или любых других пользовательских плагинов, значительно упростился. Теперь для загрузки gRPC-расширения WireMock достаточно указать всего один параметр в конфигурации:


@EnableWireMock({
@ConfigureWireMock(
extensionFactories = {Jetty12GrpcExtensionFactory.class}
)
})


4. Динамическое выделение портов и интеграция с пропертями. Одной из частых проблем при тестировании с мок-серверами является конфликт портов. WireMock решает эту задачу за счёт динамического назначения портов, что уменьшает вероятность конфликтов. Однако такой подход требует передачи номера порта в базовый URL HTTP-клиента внутри Spring Boot приложения, что может быть не таким уж простым процессом.

Интеграция WireMock с Spring Boot решает этот вопрос: порт WireMock (и другие полезные параметры среды выполнения) автоматически добавляются в контекст приложения в виде свойств, за счёт чего легко получить назначенный порт и использовать его для настройки API-зависимостей тестируемого приложения. Например:


api.client.base-url=http://localhost:${wiremock.server.port}


Начало работы с WireMock в Spring Boot:

Чтобы начать использовать официальную интеграцию WireMock с Spring Boot, добавьте в ваш pom.xml или build.gradle следующую зависимость и начните использовать аннотации и параметры конфигурации для создания экземпляров WireMock в тестах:


@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = MySpringbootApplication.class
)
@EnableWireMock({
@ConfigureWireMock(
name = "greeting-service"
)
})
class MyApplicationTests {
// Реализация тестов
}


🔗 Для примеров и подробной информации о работе с WireMock в Spring Boot оставляем ссылку на официальную документацию.
🔥60👍2514
📊 Jakarta Data и Persistence: Инструменты, которые меняют подход к работе с данными

Команда Spring АйО перевела и адаптировала доклад "Jakarta Data and Jakarta Persistence by Gavin King" Гевина Кинга с последнего Devoxx.

В своем выступлении Гевин Кинг рассказал о преимуществах и нововведениях Jakarta Data и Jakarta Persistence.

📚 Читать на Хабре: https://habr.com/ru/companies/spring_aio/articles/872830/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍259🔥7