Spring АйО
8.42K subscribers
303 photos
209 videos
402 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
Media is too big
VIEW IN TELEGRAM
🐘 Вышло свежее интервью с Олегом Бартуновым — легендой мира PostgreSQL

Это тот самый человек, который стоял у истоков российского комьюнити Postgres, создал компанию Postgres Professional и внёс огромный вклад в развитие экосистемы.

Советуем посмотреть полностью: Бартунов много говорит про астрономию (его вторая большая любовь), про баланс прикладного и фундаментального, про open source, про то, как на Postgres строят больше сотни реальных продуктов, и даже про то, чей на самом деле слон.

Занятие на вечер воскресенья найдено.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33🔥1714
Forwarded from Amplicode
☠️ Циклические зависимости в Spring: разбираемся на практике

😉 СМОТРЕТЬ НА YOUTUBE
😄 СМОТРЕТЬ В VK ВИДЕО
🥰 СМОТРЕТЬ НА RUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥19👍85👎1
🤖 Встречайте Koog — новый AI-фреймворк от JetBrains

Рустам Курамшин, эксперт сообщества Spring АйО, подготовил пост про новый AI-фреймворк от JetBrains – Koog.

AI-агенты — это не фантастика. Это новый уровень взаимодействия с LLM, где модели не просто болтают в чате, а действуют: они умеют вызывать внешние инструменты, планировать, запоминать контекст, адаптироваться и выполнять сложные задачи почти без участия человека.

Эти агенты становятся ключевым компонентом современных систем: от помощников в IDE и CI/CD пайплайнах до интеллектуальных обработчиков в бизнес-приложениях.

JetBrains представили Koog — open source фреймворк для разработки AI-агентов на Kotlin.

Что такое Koog?

Koog — это Agentic AI фреймворк, написанный полностью на идиоматичном Kotlin. Он позволяет создавать AI-агентов, которые:

- запускаются локально без внешних зависимостей
- умеют вызывать инструменты и API
- обрабатывают сложные пайплайны через графовые сценарии
- поддерживают мультимодели (OpenAI, Anthropic, Google, Ollama и др.)
- работают на JVM и JS (за счет Kotlin Multiplatform)

Koog можно использовать как для простых агентов “вопрос-ответ”, так и для построения сложных, многосоставных систем с устойчивой памятью, сжатой историей, потоковой обработкой ответов и гибкой трассировкой.

До недавнего времени экосистема Java не имела по-настоящему удобных, нативных инструментов для работы с AI-агентами, возможно кроме Spring AI в составе Spring Framework.

Пример использования минимального AI-агента в Koog:


fun main() = runBlocking {
val apiKey = System.getenv("OPENAI_API_KEY")

val agent = AIAgent(
executor = simpleOpenAIExecutor(apiKey),
systemPrompt = "Ты - очень полезный ассистент-помошник",
llmModel = OpenAIModels.Chat.GPT4o
)

val result = agent.run("Привет! Чем можешь помочь?")
println(result)
}


Koog — это, возможно, первый шаг к тому, чтобы писать LLM-based приложения просто на Kotlin без лишних зависимостей.

Как потестить Koog:

Репозиторий: https://github.com/JetBrains/koog

Документация: https://docs.koog.ai

Быстрый старт: https://docs.koog.ai/single-run-agents/

💬 Как вам Koog? Делитесь мнениями в комментариях! 👇
👍30🔥1614👎2
🧠 Подключение Spring AI к локальным AI-моделям с помощью Foundry Local

Команда Spring АйО перевела статью, которая покажет, как интегрировать Spring AI с Foundry Local — десктопным приложением от Microsoft, совместимым с OpenAI API.

Вы узнаете, как настроить локальную AI-модель, подключить её к Spring Boot и создать REST-эндпоинты для чат-бота и суммаризации текста. Всё это — с акцентом на производительность, безопасность и автономность.

📚 Читать на Хабре: https://habr.com/ru/companies/spring_aio/articles/925074/
🔥14👍76👎1
⚡️⚡️⚡️ OpenIDE – профессиональные инструменты без ограничений

Мы, Spring АйО, являемся генеральным информационным партнёром первого масштабного события, посвящённого OpenIDE — новой открытой экосистемы для Java, Kotlin, Go, Python, JavaScript и других языков.

В программе — доклады от экспертов сообщества и не только, live-демо и обсуждение концепции OpenIDE.

📅 31 июля в 17:00 МСК
📍 Бесплатно, онлайн, на всех наших платформах. Главное – зарегистрироваться.

🔗 ЗАРЕГИСТРИРОВАТЬСЯ
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍14🤩63👎1🤔1🤯1
💡 JEP 507: Примитивы в pattern matching и switch — Java 25 ломает старые ограничения

Java 25 продолжает развивать pattern matching: теперь в instanceof и switch можно будет использовать примитивные типы!

В чем была проблема?
Раньше pattern matching работал только с объектами:


if (obj instanceof String s) { ... }
А вот так было нельзя:

if (x instanceof int i) { ... } // Ошибка


То же самое со switch — примитивы были ограничены: нельзя было использовать switch на boolean, float, double, long или с примитивными паттернами.

Что добавили?
Теперь можно будет:

Использовать примитивы в instanceof:


if (num instanceof byte b) { ... } // Автоматически проверит, влезает ли num в byte
Писать switch по boolean, long, float, double:

switch (flag) {
case true -> System.out.println("Да");
case false -> System.out.println("Нет");
}


Использовать примитивные паттерны в switch:


switch (value) {
case 0 -> System.out.println("Ноль");
case int i when i > 0 -> System.out.println("Положительное: " + i);
}


Почему это круто?

– упрощаются безопасные преобразования типов без ручных проверок диапазонов.
– убираются лишние if перед кастами.
switch будет действительно универсальным: можно будет свитчить по любым типам.
– можно будет использовать примитивы в record-паттернах и instanceof так же просто, как объекты.

Пример:
Допустим, есть JSON:


sealed interface JsonValue { ... }
record JsonNumber(double d) implements JsonValue { }


Раньше:


if (json instanceof JsonNumber(double d)) {
int age = (int) d; // Ручной каст, возможна потеря данных
}


С Java 25:


if (json instanceof JsonNumber(int age)) {
System.out.println("Возраст: " + age);
}
// Сработает только если double без потери вмещается в int


Зачем это добавили?

Паттерны должны быть едиными как для объектов, так и для примитивов. Это делает язык мощнее, проще, безопаснее

Java 25 умеет проверять и безопасно преобразовывать примитивы прямо в instanceof и switch.

Как вам новая фича? Предлагаем обсудить комментариях👇
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥299🤔3👎1
🤩 Ого: Гэвин Кинг добавил интеграцию со Spring в рамках Hibernate Data Repositories

Это значит, что скоро Jakarta Data можно будет использовать в приложениях на Spring с минимальными усилиями. Без лишних приседаний.

Судя по скриншотам, интеграция выглядит привычным образом, а методы @Query, @Find и @Update уже работают как надо!

💡 Напомним: Гэвин Кинг — core contributor в Jakarta Data спецификацию, а также автор Hibernate и Ceylon. Поэтому, если кто и может сделать это по-человечески, то он!

Только что добавил интеграцию Hibernate Data Repositories со Spring, благодаря чему использовать Jakarta Data в Spring стало гораздо проще.


Пока это лишь пост Гэвина в социальной сети — официальной поддержки Hibernate Data Repositories для Spring ещё нет. Как только появятся детали от команды Spring, мы обязательно напишем.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29🤩127👍4🤔3😁21
💡 JEP 511: Импорт модулей в Java 25 — как упростить работу с библиотеками

В Java 25 появится долгожданная фича: импорт модулей. Теперь можно будет одним импортом подключать все пакеты, которые экспортирует модуль. Это сильно упростит работу с большими библиотеками, особенно в прототипах и обучении.

В чем проблема?
Например, чтобы работать с потоками, коллекциями и функциями, раньше приходилось писать кучу импортов:


import java.util.*;
import java.util.function.*;
import java.util.stream.*;


Теперь можно будет написать:


import module java.base;


И все нужные классы из java.util, java.util.stream и других будут доступны сразу.

Зачем это нужно?
– Быстрее подключать модули целиком без перечисления всех пакетов.
– Удобно для прототипов, скриптов и JShell.
– Упрощает жизнь новичкам — не нужно вспоминать, где в иерархии пакетов живет List или Stream.

Пример:


import module java.sql;

public class Demo {
public static void main(String[] args) throws Exception {
Connection conn = DriverManager.getConnection("jdbc:h2:mem:");
Statement stmt = conn.createStatement();
stmt.execute("create table test(id int)");
System.out.println("Таблица создана");
}
}


Благодаря import module java.sql; доступны все классы из java.sql и javax.sql сразу.

⚙️ Как это работает?
import module M; — подключает все публичные классы и интерфейсы из экспортируемых пакетов модуля M.

Также подключаются пакеты из модулей, от которых M зависит транзитивно.

Важно:
Это работает даже в обычных (не модульных) проектах.

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


import java.sql.Date; // Уточнение, какой именно класс Date использовать


Java постоянно расширяется, и стандартные библиотеки становятся все объемнее. import module — это способ сделать работу с ними проще и быстрее, без потери совместимости.

Что думаете о новой фиче? Предлагаем обсудить комментариях👇
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🤔108🔥8👎7
Media is too big
VIEW IN TELEGRAM
🍃 Spring сдаёт позиции, Hibernate под угрозой, AI-агенты захватывают Россию | Spring АйО Подкаст №26

😉 СМОТРЕТЬ НА YOUTUBE
😄 СМОТРЕТЬ В VK ВИДЕО
🥰 СМОТРЕТЬ НА RUTUBE
🗯 СЛУШАТЬ НА ЯНДЕКС.МУЗЫКЕ
🤩 СЛУШАТЬ НА SPOTIFY
🤩 СЛУШАТЬ НА APPLE PODCASTS

💬 Аудио версию подкаста можно найти в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥9👍7👎4😁1🤯1
🦥 Аннотация Lazy как спасение от циклических зависимостей

В прошлом посте мы подробно разобрали, как @Lazy помогает экономить ресурсы и ускорять старт приложения. Но забыли упомянуть ещё один крайне полезный кейс применения этой аннотации — борьбу с циклическими зависимостями.

Если в приложении бин A зависит от бина B, а бин B в свою очередь зависит от A — вы получите классическую circular dependency. Spring просто не сможет создать такие бины через конструкторы. Однако, если применить @Lazy на одном из аргументов, Spring обернёт зависимость в прокси и разорвёт цикл.


@Service
public class ServiceA {
private final ServiceB serviceB;

public ServiceA(@Lazy ServiceB serviceB) {
this.serviceB = serviceB;
}
}


Важно: @Lazy здесь влияет только на точку инжекции, а не на весь бин. Оба бина будут инициализированы жадно, но зависимость будет подгружена позже.

Если же вы хотите, чтобы инициализация бина проходила лениво (при первом обращении к бину), то отметьте аннотацией @Lazy и сам бин тоже:


@Lazy
@Service
public class ServiceB {
// ...
}


⚠️ Использование свойства: spring.main.allow-circular-references=true

Это ещё один способ разрешить циклы на уровне конфигурации. Spring сам предложит это в логах, если столкнётся с циклом:

Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.


Но будьте осторожны:
– Это работает только с field-based и setter-based инжекцией
– Если используете constructor-based инжекцию, то приложение по прежнему не запустится, лишь немного изменится сообщение в логах
– До Spring Boot 2.6 это поведение было включено по умолчанию — после обновления многие столкнулись с неожиданными фейлами.

Поэтому такой подход стоит рассматривать как временную меру, а не как архитектурное решение.

#SpringTips #Lazy
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3213🔥84👎4
🧨 Rich Errors в Kotlin 2.4: шаг вперёд или шаг в сторону?

На KotlinConf 2025 анонсировали одну из самых обсуждаемых новинок Kotlin — Rich Errors. Вместо того чтобы выбрасывать исключения, теперь функции могут возвращать возможные ошибки как часть своей сигнатуры:


fun fetchUser(): User | NetworkError


Такой подход делает потенциальные сбои явными, упрощает тестирование и избавляет от try-catch для предсказуемых ошибок. Новинка уже доступна в Kotlin 2.4 и, по мнению авторов, особенно полезна в бизнес-логике.

Но в сообществе мнения разделились.

Что говорят сторонники Rich Errors?

🛑Это логичное продолжение идеи безопасности типов, как null safety.
🛑Ошибки становятся частью API — теперь явно видно, какие именно проблемы могут возникнуть.
🛑try-catch больше не нужен там, где ошибка — ожидаемый результат.
🛑Тестировать становится проще: вместо моков и исключений — обычная проверка значения.
🛑Хорошо сочетается с функциональными паттернами без необходимости подключать сторонние библиотеки.

⚠️ Что вызывает сомнения?

🛑В контроллерах и сервисах с большим числом потенциальных ошибок сигнатуры методов становятся громоздкими.
🛑Нет способа элегантно агрегировать ошибки: A | B | C работает, но не имеет общей семантики.
🛑В рамках Spring-приложений реалистичная польза ограничена — фреймворки останутся на исключениях.
🛑Добавление такого типа обработки может серьёзно сказаться на времени компиляции.

💭 И что теперь?

Для одних Rich Errors — это долгожданное улучшение и эволюция Kotlin. Для других — спорный эксперимент, который добавляет сложности без ощутимой пользы в реальных проектах.

А вы как думаете? Используете ли Rich Errors в своём коде — или пока просто наблюдаете со стороны?

Ох и жарким же будет обсуждение этой новости в следующем выпуске подкаста Spring АйО 🫣
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔23👍135👎5🔥3
🚀 IntelliJ IDEA переходит на единый дистрибутив

Команда Spring АйО перевела статью от JetBrains, в которой анонсировано важное обновление: начиная с версии 2025.3, IntelliJ IDEA будет распространяться в виде единого дистрибутива, вместо отдельных версий Community и Ultimate.

Теперь каждый разработчик получит более мощный, гибкий и удобный инструмент «из коробки», независимо от подписки. Open source-компоненты по-прежнему доступны, а новая модель обещает улучшенный user experience, бесплатный доступ к большему числу функций и упрощённый процесс сборки из исходников.

📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/928668/
🔥38🤔14🤯985👎1😁1
Forwarded from Amplicode
🥳 День рождения Kotlin уже на следующей неделе!

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

В программе мероприятия доклад о ConneKt — новом HTTP-клиенте для IntelliJ IDEA, который теперь становится Open Source!

Спикеры:
🛑 Роман Елизаров (Автор корутин в Kotlin)
🛑 Илья Кучмин (Developer Advocate Amplicode)
🛑 Александр Шустанов (Product Manager в Amplicode)

📅 22 июля, 17:00 МСК
🫶 Онлайн. Бесплатно.
🔗 Зарегистрироваться
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥107👎1
Media is too big
VIEW IN TELEGRAM
🍃 IntelliJ IDEA переходит на единый дистрибутив, Rich Errors в Kotlin | Spring АйО Подкаст №27

😉 СМОТРЕТЬ НА YOUTUBE
😄 СМОТРЕТЬ В VK ВИДЕО
🥰 СМОТРЕТЬ НА RUTUBE
🗯 СЛУШАТЬ НА ЯНДЕКС.МУЗЫКЕ
🤩 СЛУШАТЬ НА SPOTIFY
🤩 СЛУШАТЬ НА APPLE PODCASTS

💬 Аудио версию подкаста можно найти в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍105
👩‍💻 Kotlin празднует день рождения!

Поздравляем всех, кто пишет, учит, продвигает и просто любит Kotlin — язык, который сделал разработку на JVM (и не только!) понятнее, приятнее и современнее. Этот язык программирования был впервые представлен компанией JetBrains 22 июля 2011 года.

С момента первой стабильной версии (1.0) в 2016 году Kotlin прошёл впечатляющий путь:

🛑2017 — Google объявила Kotlin официально поддерживаемым языком для Android
🛑2019 — Kotlin стал preferred language для Android-разработки
🛑2020 — вышел Kotlin 1.4 с улучшенной производительностью и новым тулчейном
🛑2023 — представлена стабильная версия нового компилятора K2
🛑2024 — Kotlin Multiplatform стал стабильным: теперь можно всерьёз писать на Kotlin под Android, iOS, Web и Desktop

Kotlin давно вышел за пределы JetBrains: его используют в крупных продакшн-проектах по всему миру, о нём говорят на конференциях, а комьюнити — одно из самых тёплых и активных.

С днём рождения, Kotlin! 🎂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6117👍16
Forwarded from OpenIDE
This media is not supported in your browser
VIEW IN TELEGRAM
Один инструмент для многих языков

Александр Шустанов, Михаил Поливаха и Павел Кислов продемонстрируют, как OpenIDE поддерживает мультиязычную разработку в рамках одной IDE. В формате демо реализуем бизнес-функцию охватывающую 4 сервиса на разных языках: TypeScript, Go, Python и Java/Kotlin. Расскажем, как единый инструмент упрощает навигацию, отладку и работу в мультикомандных проектах.

📅 31 июля в 17:00 МСК
📍 Бесплатно, онлайн, на всех наших платформах. Главное – зарегистрироваться.

🔗 ЗАРЕГИСТРИРОВАТЬСЯ
Please open Telegram to view this post
VIEW IN TELEGRAM
17🔥13👍81👎1👌1
🧩 Spring Data JDBC и R2DBC 4.0 получат поддержку составных идентификаторов

Эксперт Spring АйО и по совместительству Spring Data контрибьютор Михаил Поливаха прокомментировал статью, переведенную командой Spring АйО, про поддержку составных ключей со стороны Spring Data JDBC и R2DBC, начиная с версии 4.0.0-M4 — то, чего так не хватало при работе с моделями, где первичный ключ состоит из нескольких полей.

Теперь достаточно просто описать record с нужными полями, пометить его как @Id, и Spring Data сам корректно построит SQL-сущность.

📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/930354/
👍25🔥119🤩1
🔥 Spring АйО — это живое сообщество

Хотите что-то обсудить? Нашли интересную статью? Есть вопрос, на который нужен экспертный взгляд?
Предлагайте темы для постов и переводов — просто напишите нам в личку.

Мы всегда на связи — обсуждаем, спорим, поддерживаем и растём вместе. Нам важно ваше мнение, ваш опыт, ваши вопросы. Также не забывайте про наш чат, эксперты Spring АйО в нем всегда на связи!

Давайте делать контент вместе!
16🔥8👍4