Spring АйО
10.3K subscribers
424 photos
291 videos
550 links
Русскоязычное сообщество Spring-разработчиков.

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

Чат для общения: @spring_aio_chat
По вопросам сотрудничества: @befayer
Download Telegram
⚠️ Java продолжает готовиться к удалению finalize()

В рамках JDK 27 у ThreadPoolExecutor-а, очень популярного API в Java, будет удалён метод finalize(). Несмотря на то, что в силу dynamic dispatch вызов метода finalize() всё равно будет транслирован в Object, данное изменение не source level compatible.

А все потому, что у Object.finalize() сигнатура содержит throws Throwable, в то время как ThreadPoolExecutor.finalize() — нет. Пока метод был в ThreadPoolExecutor, компилятору было ок. Как только его удалят, вызов super.finalize() начнет резолвиться в Object.finalize(), и тогда прилетит “unreported exception Throwable”.

Комментарий от Михаила Поливаха:
Вот это кстати довольно редкий пример того, что имзенение может быть binary level compatible, но не source level compatible.


Например:


class MyPool extends ThreadPoolExecutor {
@Override
protected void finalize() {
super.finalize(); // JDK 27: теперь это Object.finalize() throws Throwable
}
}


Как избежать?

* поискать и удалить любые finalize() / super.finalize() (и вообще любые авто-cleanup через финализацию)
* управлять жизненным циклом executor’ов явно: shutdown()/awaitTermination() или просто close() в try-with-resources (да, ExecutorServiceAutoCloseable)

Spring АйО рекомендует не использовать finalize() в целом, но если подобного рода хук нужен, то лучше использовать Java Cleaner API. С его помощью нельзя "случайно" воскресить объект, сломать integrity объекта или т.п.

Ждем JDK 27 🫠
👍28🔥96
Media is too big
VIEW IN TELEGRAM
🍃 Java без Spring`а, это ИИ подкаст, HotSpot AOT-кэш | Spring АйО Подкаст №51

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

💬 Аудио версию подкаста можно найти в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1842😁2🔥1🤯1
Forwarded from OpenIDE
Reksoft ❤‍🔥 OpenIDE

В прошлом году Reksoft перевёл Kotlin/Java-команды на OpenIDE с Amplicode из-за ограничений лицензий JetBrains.

Тестировали Eclipse, VS Code и GigaIDE. Первые два потребовали много ручной настройки и уступали по навигации и поддержке Spring/Kotlin. GigaIDE оказалась близка к IntelliJ Community, но до Dev Experience IntelliJ Ultimate не дотянула.

OpenIDE с Amplicode закрыла ключевые требования: генерация CRUD и тестов, docker-compose из интерфейса, встроенный HTTP-клиент, reactive debugger и интеграция с Git.

В итоге почти все JVM-команды в Reksoft сейчас используют OpenIDE.

📚 Подробнее в блоге компании Reksoft на Habr: История одного безальтернативного переезда. Почему мы выбрали OpenIDE
🔥26👍16😁54🤔3🤯1
Разрыв в неизменяемости: почему Java Records нужны оптики (Lenses)

Records и pattern matching сделали чтение вложенных данных в Java удобным. Но обновить поле глубоко внутри неизменяемой структуры все еще больно: чтобы поменять одну строку (street у адреса менеджера отдела), приходится вручную пересобирать каждый record по пути. В примере это около 25 строк с каскадом копирующих конструкторов и риском ошибки на каждом уровне.

Потенциально новые методы withX() в record помогают мало: обновленное значение все равно нужно протаскивать назад через Address -> Employee -> Department -> Company. Даже JEP 468 (with для records, preview в JDK 25) упрощает один уровень, но не поддерживает вложенное обновление, поэтому получаются цепочки with на каждом слое.

Оптики закрывают этот разрыв: это типобезопасные, компонуемые пути доступа, которые позволяют один раз описать маршрут и дальше читать/писать по нему. Базовая оптика - Lens (ровно 1 цель), есть Prism (0/1 вариант sealed), Affine (0/1 без построения), Traversal (0..many для коллекций). Скомпонованные линзы сами выполняют промежуточную реконструкцию, и обновление превращается в одно простое выражение.

📚 Полный текст по ссылке: https://habr.com/ru/companies/spring_aio/articles/1001066/
🔥18🤯118👍4🤔1
😵 Руководство по ArchUnit — как модульно тестировать архитектуру

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

В новом переводе от команды Spring АйО рассмотрим библиотеку с открытым исходным кодом ArchUnit, которая помогает в тех случаях, когда одного компилятора недостаточно.

📚 Полный текст по ссылке: https://habr.com/ru/companies/spring_aio/articles/1001486/
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍17🔥105
🍃 Ceylon и NULL: как сделать null нормальным

В одном и том же null часто прячут разные смыслы: “нет значения”, “неизвестно”, “неинициализировано”. Потом это всплывает в NPE и в кривой логике исполнения.

В Ceylon эту проблему решают через типовую систему, через Union типы. Подробнее, в переводе от Spring АйО.

Комментарий от Михаила Поливаха:

Статья достаточно старая, написанная Лукасом Едером (автор Jooq) про реализацию nullability Ceylon.

Конечно, Ceylon довольно старый язык, мёртвый на данный момент. Его дизайнером кстати когда-то выступал сам Gavin King (тот самый автор Hibernate).

Тем не менее, это единственный относительно известный на моей памяти язык поверх JVM, который поддерживал Union типы (не считая Scala 3), через которые и была сделана реализация nullable типов в Ceylon.

Статья больше призвана расширить Ваш кругозор и призвать Вас к осмысленной дискуссии. Приятного чтения.


📚Полный текст по ссылке: https://habr.com/ru/companies/spring_aio/articles/1001982/
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1310👍91
TechMeetup #11: Spring АйО x МТС Банк

Осталось 5 дней...

В программе:

Доклады от экспертов Spring АйО:
👤 Евгений Сулейманов: HTTP Service Clients + API Versioning в Spring Boot 4: типобезопасный REST без зоопарка клиентов (и без боли при эволюции API);

👤 Павел Кислов: Тренды в Spring. Куда мы движемся и что поменялось в Spring Framework за 2025 год.;

👤 Михаил Поливаха: Встречайте Axelix: Спецназ для вашей Spring Boot экосистемы;

👥 Дискуссия "Мы видим перед собой последнее поколение разработчиков?" со взглядом бизнеса, менеджмента и разработки:
Федор Сазонов, CEO OpenIDE;
Павел Кислов, Developer Advocate Amplicode;
Марат Рахимов, Директор по AI-трансформации МТС Банка;

🗓 Когда: 26 февраля 2026, с 19:00 до 22:30 GMT+03:00 (онлайн и офлайн);
📍 Где (офлайн): Москва, м. Технопарк. Проспект Андропова 18, корпус 1. (Здание с вывеской МТС Банк, Медиарум);

💻 Онлайн трансляция будет на странице мероприятия
требуется регистрация на формат посещения "Онлайн"

👍 Участие: бесплатно
🎉 Нетворкинг: бесценно

Регистрация продолжается до 23-го февраля на странице мероприятия
Количество мест ограничено, успей забронировать место

Spring АйО | МТС Банк

---

Рассылка подтверждений будет до 24-го февраля включительно.
Не забудь проверить свою почту, включая папку «Спам» и «Промо».


TechMeetup | CFP: Подать доклад | Общалка и вопросы | Записи
Please open Telegram to view this post
VIEW IN TELEGRAM
👍138🔥4
Media is too big
VIEW IN TELEGRAM
🍃 JVM язык Ceylon, K1 тяжелый, зачем нам ArchUnit | Spring АйО Подкаст №52

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

💬 Аудио версию подкаста можно найти в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥139👍81
Forwarded from OpenIDE
⚡️ Haiku обошла Opus | Claude слил $1.78 млн | Нейросеть впаяли в кремний

Второй выпуск еженедельных IT-новостей от OpenIDE.

В этот раз: вайбкодер случайно получил доступ к 7 000+ пылесосам, вышли Sonnet 4.6 и Gemini 3.1 Pro, Haiku со скиллами обошла Opus без них, Claude Code Security и потеря $1,78 млн из-за кода от Claude.

😉 СМОТРЕТЬ НА YOUTUBE
😄 СМОТРЕТЬ В VK ВИДЕО
🥰 СМОТРЕТЬ НА RUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12🔥10👍65
🌧 Оптимизация Java-приложений для Arm64 в облаке

JVM в первую очередь процесс операционной системы. Но важно понимать, что требования к этому процессу на production отличатся от требований на workstation-е разработчика.

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

В новом переводе от команды Spring АйО разберем, какие существуют базовые настройки кучи, GC и CPU помогают синхронизировать JVM с лимитами контейнера и не переплачивать за простаивающие ресурсы.

Комментарий от Михаила Поливаха:

Все оптимизации в статье применимы не только к ARM-овым CPU, но и к x86. Это важно, потому что большая часть Ваших серверных workload-ов, даже если Вы об этом не знаете, они бегут на x86_64. Поэтому, статья для Вас тоже актуальна.


📚Полный текст по ссылке: https://habr.com/ru/companies/spring_aio/articles/1003602/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍239🔥41
❗️Spring АйО на Java Rock Stars meetup ❗️

Друзья, по традиции, эксперты Spring АйО выступят на ближайшем Java Rock Stars meetup.

5 марта. Москва. Лофт Casa Picassa на Бауманской.

💬 В программе:

Илья и Фёдор Сазоновы расскажут о том, как обычные проекты внезапно начинают задыхаться при масштабировании, хотя пользователей и данных там не так много. Узнаем о причине проблем с производительностью и главном правиле работы с реляционными БД, которое регулярно нарушают.

Александр Ланцов покажет, как работа со строками и произвольным Unicode в Java может поставить в тупик даже опытного разработчика, и разберёт типичные ошибки на примерах.

Для участия нужна только регистрация.
🔥2111👍91
Forwarded from Amplicode
🔥 Тестирование API простыми словами + практика | Postman, Connekt

В новом видео разбираем тестирование API с нуля: что такое API, как работает HTTP, и переходим к практике в двух инструментах — Postman и Connekt.

В части про Postman: создаём GET и POST запросы, импортируем коллекции из Swagger, cURL и браузера, перехватываем трафик и настраиваем переменные окружения.

Дальше — то же самое в Connekt: импорт из Postman, работа с эндпоинтами Spring-приложения, все основные HTTP-методы, авторизация, работа с файлами, assertions и сложные сценарии с цепочками запросов.

😉 СМОТРЕТЬ НА YOUTUBE
😄 СМОТРЕТЬ В VK ВИДЕО
🥰 СМОТРЕТЬ НА RUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍18🔥139
✈️ Когда использовать параллельный стрим в Java?

parallelStream() не всегда быстрее: в бенчмарке sum(1..100) в параллели занял ~35 476 нс/оп против ~68 нс/оп в последовательном.

Параллельные стримы работают через ForkJoinPool.commonPool (кол-во потоков: ядра CPU - 1). Порядок обработки элементов не фиксирован, а некорректный reduce может дать неверный итог: identity прибавляется в каждом worker`е (например, reduce(5, sum)).

Где параллельные стримы реально полезны:

– Большой объем данных и много вычислений на элемент (так называемая модель NQ: чем больше N*Q, тем выше шанс ускорения; для тривиального суммирования эмпирически N > 10 000).

– Источник легко и равномерно делится: массивы и ArrayList. На 1 000 000 элементов ArrayList в бенчмарке быстрее в параллели (~2.0 мс vs ~5.4 мс).

– Дешевая операция объединения результатов: reduce/sum обычно выигрывают. Например, сумма на ArrayList быстрее в параллели (~2.07 мс vs ~5.51 мс).

– Хорошая локальность данных. Например, массив примитивов (int[]) даёт больший выигрыш, чем массив ссылок (Integer[]), потому что меньше скачков по памяти.

– Есть I/O с большим числом объектов: поиск по 1500 текстовым файлам через Files.walk в параллели быстрее (~10.8 мс vs ~13.3 мс).



📚 Подробнее тут: https://habr.com/ru/companies/spring_aio/articles/1005180/
2👍226🔥51