Spring АйО
9.73K subscribers
390 photos
277 videos
507 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
🌱 Некоторые детали реализации Slice Pagination в Spring Data JPA

Spring Data JPA предлагает два подхода к пагинации: Page и Slice. В отличие от Page, Slice не знает общего количества записей, но всё равно умеет определять, есть ли следующая страница. Как это возможно без COUNT-запроса?

На этот вопрос ответил наш эксперт Михаил Поливаха:

Мы уже как-то писали о том, что в Spring Data есть 2 способа вернуть данные в постраничном виде - Page и Slice. Разница довольно простая - Slice не знает общий размер датасета, который удовлетворяет запросу, а Page знает. Достигается это знание отправкой ещё одного COUNT-запроса в БД.

Однако, несмотря на это, Slice способен ответить на вопрос, есть ли следующая страничка данных:


public interface Slice<T> extends Streamable<T> {

/**
* Returns if there is a next {@link Slice}.
*
* @return if there is a next {@link Slice}.
*/
boolean hasNext();
}


То есть, как минимум, Slice должен понимать, следующая страничка с данными присутствует, при этом не делая "COUNT".

Чтобы реализовать это, Spring Data JPA, например, делает очень простую вещь:

int pageSize = 0;

if (pageable.isPaged()) {
pageSize = pageable.getPageSize();
createQuery.setMaxResults(pageSize + 1);
}

List<Object> resultList = createQuery.getResultList();
boolean hasNext = pageable.isPaged() && resultList.size() > pageSize


То есть, из БД запрашивается не pageSize, а pageSize + 1, то есть чуть-чуть больше. Ну и дальше простое сравнение - если нашли pageSize, то странички дальше точно нет, а если нашли pageSize + 1, то страничка дальше точно есть (хотя может и меньшего размера).

Вот так вот оно работает 😉
🔥63👌127👎2
Media is too big
VIEW IN TELEGRAM
🍃 AI-агенты портят разработчиков, JVM ничего не гарантирует, верните фишинг | Spring АйО Подкаст №45

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

💬 Аудио версию подкаста можно найти в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20😁85👎1
🌱 Spring Boot наконец получил нативную поддержку gRPC

Забудьте о сторонних стартерах и костылях — Spring gRPC 1.0 GA уже здесь. Теперь можно строить высокопроизводительные RPC-сервисы с Protocol Buffers прямо из коробки, без плясок с бубном.

В новом переводе от команды Spring АйО рассмотрим пошаговую миграцию со старых решений, генерацию кода из .proto, и сравнение с тем, как это работает в Quarkus. 

📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/978418/
🔥6418👍162🤯1
🏎 Как ускорить MongoDB в Java: profiling, explain(), индексация и антипаттерны

Подготовили материал о том, почему «быстрый запрос в MongoDB» — это индексы, форма запроса, проекции, explain(), профайлер и наблюдаемость в Java/Spring Boot.

Разбираем, как отличать IXSCAN от COLLSCAN, где чаще всего прячутся антипаттерны (skip-пагинация, тяжёлые $regex/$nin, findAll), и как выстроить измеримый цикл оптимизаций от Atlas/Compass до Micrometer.

📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/979440/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍841
Forwarded from Amplicode
🤩 Продвинутый Telegram-бот для Spring АйО. Часть 1: Архитектура и первая рабочая версия

Запускаем цикл видео про разработку телеграм-бота на Spring!

В первом выпуске — база, на котором строится весь сервис. На самом деле, мы уже всё подключили, развернули и запустили в облаке, можно тыкать (@spring_aio_bot) 😉 Для подписчиков там даже есть приятный бонус)

В следующих частях покажем, как интегрировали в бота Spring AI и как разворачивали всё это дело.

Ну и конечно — код открыт и лежит на GitHub. Забирайте, изучайте, экспериментируйте!

😉 СМОТРЕТЬ НА YOUTUBE
😄 СМОТРЕТЬ В VK ВИДЕО
🥰 СМОТРЕТЬ НА RUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥1564😁2
Parallel streams — это не «бесплатный» прирост производительности, а дорогая оптимизация.

🟣 Любое распараллеливание добавляет накладные расходы: разбиение данных, управление задачами через fork-join, синхронизацию и объединение результатов. Если операция над элементом дешёвая или данных недостаточно много, этот оверхед полностью съедает потенциальный выигрыш — и последовательный стрим оказывается быстрее.

🟣 Вторая причина — ограничения самой задачи. Многие вычисления по природе последовательны или содержат существенную последовательную часть, которую нельзя распараллелить. Закон Амдала жёстко ограничивает максимальный speedup: даже небольшой последовательный участок ставит потолок ускорению, независимо от количества ядер. В streams эта доля часто больше, чем кажется.

🟣 Наконец, упор часто происходит не в CPU, а в память. Параллельные стримы хорошо работают на больших массивах, но быстро деградируют на графах, списках и указательных структурах. В таких случаях потоки не ускоряют вычисления, а просто параллельно ждут данные из памяти.

Подробнее в новом переводе статьи от Брайана Гоетца – одного из ключевых архитекторов экосистемы Java и главного авторитета по конкурентному и параллельному программированию в JVM.

@spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
25👍23🔥112
🚀 Тред-дампы и Project Loom (виртуальные потоки)

С появлением виртуальных потоков в Java благодаря Project Loom, параллельное программирование стало проще, а производительность — выше.

Однако за этой простотой кроются новые вызовы для инструментов отладки и анализа. Как читать тред-дампы, если их теперь тысячи — или миллионы? Какие средства реально помогают найти взаимные блокировки и аномалии в асинхронном коде? Рассмотрим в новом переводе от команды Spring АйО.

📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/980566/
🔥20👍117
🥷 Hidden классы в Java. Что скрывают Lambda выражения

С переходом Java на более безопасные и стандартизированные подходы к динамической генерации классов, скрытые (hidden) классы стали ключевым механизмом замены устаревшего Unsafe::defineAnonymousClass.

Они решают проблемы доступности, управления жизненным циклом и контроля доступа, особенно актуальные для разработчиков фреймворков и языков на JVM. Хотя скрытые классы пока не полностью заменяют функциональность Unsafe, они лежат в основе ряда важных механизмов, такие как, например, реализация лямбд в JDK.

📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/980928/
🔥17👍94
🛠 Михаил Поливаха. Garbage Collection. Где мы сейчас

Наш эксперт Михаил Поливаха выступил с докладом про сборку мусора:

Сборка мусора является довольно сложным механизмом. В большинстве managed языков runtime скрывает от нас детали дислокации памяти. С другой стороны, выбор определённого сборщика мусора может существенно улучшить производительность.

Поговорим о том, какие алгоритмы сборки мусора бывают, какие бывают концептуальные трейд оффы при их использовании, и какой алгоритм вам может подойти больше всего.


😉 СМОТРЕТЬ НА YOUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33👍953
Media is too big
VIEW IN TELEGRAM
🍃 gRPC в Spring Boot, зачем разработчику Hidden классы, HashMap vs MongoDB | Spring АйО Подкаст №46

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

💬 Аудио версию подкаста можно найти в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥117🤩1
Forwarded from Amplicode
⚡️ Spring MCP: набор инструментов для AI-помощника от Amplicode

Эта статья дополняет предыдущую. Там мы зафиксировали проблемы. Здесь разберем, что именно мы сделали со стороны Amplicode, чтобы агент начал работать как опытный software engineer: опираясь на структуру проекта, детерминированные генераторы и понятные высокоуровневые операции.

Если коротко, в первой статье было несколько основных болей:

• LLM часто обучены на слегка устаревшем мире, и это вылезает в мелочах (и не только)
• Галлюцинации и нехватка контекста идут рука об руку: «кажется, в этой библиотеке должен быть такой метод» и пошло-поехало
• Переизбыток контекста тоже зло: агент прочитал половину репозитория, потратил деньги, запутался, а потом еще и забыл начало чата
• Типичный агентный workflow: «сгенерил простыню кода, оно не компилится, давай чинить, ой теперь сломалось другое»

И на этом фоне появляется логичный вопрос:

А можно сделать так, чтобы агент работал не с сырыми файлами, а с моделью проекта и сущностями фреймворка? Чтобы он не гадал, где DTO, как принято именовать контроллеры и какие миграции у вас используются?


Собственно, Spring MCP от Amplicode про это.

📚 Читать на Хабр: https://habr.com/ru/companies/haulmont/articles/976872/
👍20🔥123👎1
🍃 Дорогие друзья и участники сообщества Spring АйО!

Уходящий год еще раз показал, какую силу имеет профессиональное сообщество. Сегодня Spring АйО — это уже почти 10000 разработчиков, объединенных интересом к Spring, технологиям, обмену опыта и живому диалогу. Ваша вовлеченность, вопросы, комментарии и поддержка делают это пространство по-настоящему ценным.

В 2026 году нас ждут новые идеи, форматы и темы. Мы планируем еще больше полезных материалов, практических разборов и обсуждений того, что действительно важно для Spring-разработчиков.

Спасибо, что остаетесь с нами и разделяете этот путь. С новым годом, друзья!🎄
🔥10335🤩10👎1
🎙 Второй выпуск подкаста «За ширмой IT» уже на канале!

Друзья, эксперты Евгений Сулейманов и Михаил Поливаха поговорили о том, что действительно важно для инженера сегодня и завтра:

— зачем разработчику на самом деле нужен open source
— почему спикерство — это не только про сцену и лайки
— что происходит с рынком и при чем тут AI
— как выбирать технологии и выстраивать обучение, если не хочется бегать за каждым трендом

😉 СМОТРЕТЬ НА YOUTUBE

Приятного просмотра и, как всегда, будем рады вашим мыслям в комментариях 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
👍189🔥4👎3