Spring АйО
8.45K subscribers
304 photos
216 videos
405 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
🧠 Подключение 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🤔15🤯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
5👍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
🔥6217👍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
18🔥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/
👍26🔥119🤩1
🔥 Spring АйО — это живое сообщество

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

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

Давайте делать контент вместе!
17🔥8👍4
🛠 Structured Concurrency в Java: наконец-то находит опору

API structured concurrency в Java наконец-то обрёл устойчивость. В новом переводе от команды Spring АйО подробно рассматриваются последние изменения, появившиеся с выходом JEP 505: фабричный метод open(), политики Joiner'ов, улучшенная отмена задач, дедлайны, передача контекста через ScopedValues и строгая защита от ошибок использования. Всё это делает параллельное программирование в Java более безопасным, читаемым и управляемым.

📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/930812/
5🔥24👍119
Forwarded from Amplicode
Media is too big
VIEW IN TELEGRAM
⚡️ Connekt: Новый HTTP-клиент для IntelliJ IDEA — теперь Open Source

Роман Елизаров, Илья Кучмин и Александр Шустанов:

🛑 Обсудили, почему стандартных инструментов в IDE и консольных тулов часто недостаточно для сложных сценариев.
🛑 Показали, как с помощью ConneKt просто вызывать HTTP-сервисы, строить цепочки запросов, извлекать данные из ответов и писать ассерты.
🛑 Разобрались, как использовать клиент в IDE, CI и консоли.

––––– Таймкоды –––––
00:00:00 – Хайлайты
00:00:41 – Вступление. О чём сегодня поговорим?
00:05:10 – Демо. Основные возможности Connekt и мощная интеграция со Spring Boot.
00:44:43 – Демо. Connekt и работа с защищенными эндпоинтами (авторизация, аутентификация, Spring Security)
00:59:51 – Демо. Работаем с внешним API используя Connekt. Формируем цепочки вызовов
01:17:55 – Заключение. А что еще умеет Connekt?


😉 СМОТРЕТЬ НА YOUTUBE
😄 СМОТРЕТЬ В VK ВИДЕО
🥰 СМОТРЕТЬ НА RUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2012👍10
🧠 JEP 519: Компактные заголовки объектов — теперь официально!

Java 25 анонсирует ещё одну немаловажную фичу: компактные заголовки объектов (Compact Object Headers). Это позволит JVM экономить память и ускоряться без вмешательства в код.

Что это такое?
У каждого объекта в Java есть заголовок — служебные данные, которые JVM использует для синхронизации, GC и т.д. Обычно заголовок занимает 96 бит (12 байт) на 64-битных платформах.

С JEP 450 в Java 24 появится экспериментальная опция сжать заголовки до 64 бит (8 байт). JEP 519 делает это стабильной, проверенной фичей, которую можно безопасно включать прямо в проде.

Зачем?
– Минус 22% памяти в SPECjbb2015
– Минус 8% CPU в среднем
– Минус 15% сборок мусора в G1 и Parallel GC
– +10% скорость парсинга JSON

Для распределённых систем, высоконагруженных сервисов и микросервисов — это простой способ сэкономить ресурсы без переписывания кода.

Как включить?
В Java 25 больше не понадобится флаг


-XX:+UnlockExperimentalVMOptions


Теперь достаточно:

java -XX:+UseCompactObjectHeaders ...


Пруфы?
– Протестировано в проде на сотнях сервисов Amazon.
– Прогнано по полному тест-сьюту JDK в Oracle.
– Отдельные компании уже бэкпортят фичу на JDK 21 и 17.

Что важно знать?
– По умолчанию выключено.
– Не влияет на функциональность приложения.
– Может потребовать внимания в будущем, если другие фичи потребуют больше битов в заголовке (но для этого есть решения в рамках проектов Valhalla и Lilliput).

Обсудим в комментариях? 👇
👍38🔥1811