Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
🎉 Поздравляем с 8 марта

Сегодня отмечаем вклад девушек-разработчиков, аналитиков, тестировщиков, тимлидов и всех, кто влюблён в код. Без вас IT не было бы таким, каким мы его знаем. С праздником, коллеги 💐

Женщины оставили огромный след в истории IT. Если вам кажется, что программирование — это исключительно «мужская территория», взгляните, вот лишь несколько легендарных женщин:

🔹 Ада Лавлейс — автор первой компьютерной программы ещё в 19 веке.
🔹 Грейс Хоппер — создала первый компилятор и популяризировала термин «баг».
🔹 Барбара Лисков — её принцип Liskov Substitution является основой ООП, в том числе в Java.
🔹 Эдит Кларк — первая женщина-инженер, внесшая вклад в вычислительные методы в энергетике.
🔹 Маргарет Гамильтон — разработала софт для посадки «Аполлона-11» на Луну.

А это только малая часть. В статье собраны ещё больше вдохновляющих историй.

🔗 Подробнее в статье

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
🆕 Java Digest: что нового в мире Java

🔹 JEP-ы в фокусе:


Автонастройка хипа для Serial GC. Теперь JVM сама решает, сколько памяти нужно вашему приложению.
AOT-оптимизации. Меньше возни с кэшем, JVM научилась готовить его сама.
Cooperative JFR Sampling. Профилирование без лишних тормозов.

🔹 Релизы:

— JDK 24 (Build 36) и JDK 25 (Build 9): свежие сборки, багрепорты приветствуются.
— Hibernate ORM 7.0.0 (Beta 4): новая Jakarta Persistence 3.2 и прокачанный анализ моделей.
— Quarkus 3.18.2: фиксы и поддержка последних обновлений зависимостей.
— Micronaut 4.7.5: улучшения в безопасности, валидации и Kafka.

🐸 Библиотека джависта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Serial Garbage Collector?

Serial GC — это однопоточный сборщик мусора, работающий по принципу "Stop-the-World". Он останавливает выполнение всех потоков во время сборки мусора и использует копирующий алгоритм для молодых поколений (Young Gen) и компактирующий алгоритм для старших (Old Gen).

🔹 Как работает

1️⃣ В молодом поколении (Minor GC) используется копирующая стратегия: выжившие объекты перемещаются из Eden в Survivor, а из Survivor в Old Gen.
2️⃣ В старом поколении (Major GC / Full GC) выполняется уплотнение памяти для уменьшения фрагментации.
3️⃣ Так как GC работает в одном потоке, во время сборки остановка приложения неизбежна.

🔹 Когда использовать

В одноядерных системах или при ограниченных ресурсах, где многопоточный GC создаст больше нагрузки.
В маленьких JVM (до 1-2 ГБ памяти), где G1 или Parallel GC будут избыточны.
В приложениях без жестких требований к паузам, например, в небольших утилитах или CLI-инструментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Переживёте ли вы Skynet?

Кто-то считает, что вежливость — базовый навык общения даже с машиной. Кто-то уверен, что железяке безразличны ваши манеры.

Пишете ли вы "Спасибо" и "Пожалуйста" AI? Что в целом думаете на этот счёт?

💬 Делитесь вашим мнением в комментариях.

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔝 Java наступает Python на пятки

Java захватывает территорию Python на поле искусственного интеллекта — и в корпоративном секторе сопротивление может оказаться бесполезным, считают опрошенные порталом The New Stack эксперты.​

Саймон Риттер, заместитель технического директора компании Azul Systems, утверждает, что 2025-й может стать последним годом господства Python в сфере ИИ. По его словам, исследования показывают, что в течение ближайших 18 месяцев Java может обогнать Python в разработке ИИ-приложений.​

💬 Что думаете, есть ли у Python шансы?

🔗 Подробнее в статье

🐸 Библиотека джависта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Как корректно работать с @Transactional в Spring

Аннотация @Transactional — мощный инструмент, но ее неправильное использование может привести к незаметным, но критическим ошибкам: потерянные данные, неожиданные откаты или вовсе отсутствие транзакции. Разбираем частые ошибки и их решения.

@Transactional в том же классе

Если вызываете транзакционный метод внутри того же класса (this.method()), Spring-прокси не срабатывает, и транзакция не создается.
@Service
public class OrderService {

@Transactional
public void createOrder() {
saveOrder(); // Вызов внутреннего метода - транзакция НЕ создается!
}

private void saveOrder() {
// Сохранение заказа
}
}


— Решение: вынести метод в другой Spring-бин.

@Transactional в private-методах

Spring AOP работает через прокси, а прокси не видит private-методы. В результате @Transactional в таких методах просто игнорируется.
@Transactional
private void saveData() { // Транзакция НЕ будет работать!
repository.save(entity);
}


— Решение: метод должен быть public и вызываться через другой Spring-бин

Неправильный выбор Propagation

Уровень распространения (propagation) определяет, как транзакция будет вести себя относительно уже существующих транзакций. Выбор значения по умолчанию (REQUIRED) подходит в большинстве случаев, но в сложных сценариях важно понимать, как работают другие варианты:

— REQUIRED использует текущую транзакцию, если она есть, иначе создаёт новую.
— REQUIRES_NEW всегда создаёт новую транзакцию, независимо от текущей (может привести к неожиданным коммитам).
— NESTED создаёт вложенную транзакцию, которая откатывается отдельно от родительской.
— SUPPORTS использует существующую транзакцию, но не требует её (если транзакции нет, работает без неё).
— NOT_SUPPORTED выполняет код вне транзакции, даже если она уже существует.
— NEVER гарантирует, что код выполняется только вне транзакции, иначе выбрасывает исключение.
— MANDATORY требует, чтобы код выполнялся внутри уже существующей транзакции, иначе выбрасывает исключение.

Откат только по CheckedException

Spring по умолчанию откатывает транзакции только при RuntimeException, а CheckedException (например, SQLException) его не прерывает. Однако изменение этого поведения требует осторожности.
@Transactional
public void updateUser() throws IOException { // CheckedException не откатит транзакцию!
userRepository.save(user);
throw new IOException("Ошибка ввода-вывода");
}


— Решение: указать rollbackFor = Exception.class, если хотите откатывать и CheckedException.

@Transactional в контроллере

Spring сначала коммитит транзакцию, а потом отправляет HTTP-ответ. Если после коммита возникнет ошибка (например, сеть упала), клиент может получить 500, но изменения уже сохранены.

— Решение: транзакции должны быть в сервисах, а не в контроллерах.

💬 Какие проблемы с @Transactional встречались в практике?

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
📝 Структуры данных: ТОП-30 вопросов и ответов для собеседований в 2025 году

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

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

📄 Прочитайте статью и укрепите свои знания https://proglib.io/sh/1uYAygzIxr

Библиотека питониста
👑 Магия IntelliJ IDEA

Все знают Ctrl + Alt + L (форматирование кода), но мало кто знает это сочетание:

Ctrl + Alt + Shift + L → Гибкое форматирование

🔹 Зачем это нужно


— Позволяет выбрать, что именно форматировать: весь файл, выделенный код или даже только измененные строки.
— Можно отключить автоформатирование аннотаций, импортов или пробелов, если не хотите, чтобы IDEA ломала ваш стиль.
— Полезно, если работаете в команде с жесткими code style правилами, можно форматировать только нужные части, не трогая остальной код.

🔹 Дополнительные трюки

— Выделите код, затем Ctrl + Alt + Shift + L, чтобы форматировать только его.
— Используйте Settings → Editor → Code Style, чтобы настроить форматирование под себя.

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 Чек-лист: эффективная работа с многопоточностью

Держите под рукой этот чек-лист, чтобы избежать проблем с многопоточностью и повысить производительность кода:

🔹 Синхронизация


✓ Избегайте synchronized для долгих операций
✓ Используйте ReentrantLock для гибкой блокировки
✓ Следите за возможностью deadlock

🔹 Исполнители (Executors)

✓ FixedThreadPool подходит, когда количество потоков заранее известно и ограничено
✓ CachedThreadPool динамически создает потоки, но может привести к их неконтролируемому росту
✓ ForkJoinPool для задач, разбиваемых на подзадачи

🔹 Коллекции и очереди

✓ ConcurrentHashMap потокобезопасная альтернатива HashMap, но не подходит для сценариев с частыми изменениями
✓ BlockingQueue для потокобезопасных очередей
✓ CopyOnWriteArrayList хорош при редких изменениях списка, но ⚠️ медленный при частых модификациях (из-за копирования)

🔹 Работа с Future & CompletableFuture

✓ Используйте CompletableFuture для асинхронных операций вместо Future
✓ thenApply() и thenCompose() позволяют строить цепочки вызовов без блокировки
✓ exceptionally() для обработка ошибок без использования try-catch в коде

Автоматизируйте проверку кода с помощью FindBugs, SonarQube и Checkstyle.

💬 Какие задачи на проекте решаете с помощью многопоточки?

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍 Что посмотреть: что нового в Java 24?

Хотите узнать, какие фичи принесёт релиз Java 24 и как они повлияют на вашу разработку? Тогда это видео — must-watch 🎥

Никола Поллок, разработчик Java в Oracle, рассказывает о самых свежих изменениях в экосистеме Java:
— AOT-компиляция
— Виртуальные потоки
— Новые API для работы с байт-кодом и потоками
— GGC и ZGC

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

🔗 Смотреть видео

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🐧 Пингвин, покоривший мир: история взлета Linux – ОС, управляющей 96% серверов

В 1991 году на компьютере с 4 мегабайтами памяти родилась программа, которая сегодня управляет большей частью интернета, смартфонами и даже космическими аппаратами. Это история Linux, рассказанная одним из первых свидетелей.

➡️ Читать статью
➡️ Зеркало
Lombok — да или нет?

✔️ За Lombok

— Убирает тонны шаблонного кода (геттеры, сеттеры, toString(), equals(), hashCode()).
— Делает код компактнее и читабельнее.
— Ускоряет разработку, снижает когнитивную нагрузку.

Против Lombok

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

💬 За Lombok или против? Пишите в комменты

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🆕 Java Digest: что нового в мире Java

🔹 JEP-ы в фокусе:


— JEP 450: компактные заголовки объектов

JEP направлен на уменьшение размера заголовков объектов с 96–128 до 64 бит на 64-битных платформах, перешел в статус Proposed to Target. Это изменение обещает снизить объем используемой кучи и повысить эффективность работы приложений.​

— JEP 484: API для файлов классов


В JDK 24 планируется внедрение JEP 484, который предоставит стандартный API для обработки файлов классов.

🔹 Релизы:

— Выпуск IntelliJ IDEA 2024.3 EAP 5: gоддержка функций Kotlin 2.1, улучшенная подсветка выделенных слов во всем файле, новые иконки и другое.
— Kora 1.1.20: улучшения и исправления способов настройки компонентов gRPC, ошибок обработки Cassandra UDT типа для списков, работа дискриминаторов моделей в OpenAPI-генераторе
— Native Build Tools 0.10.5: поддержка единого reachability-metadata.json, ​исправление ошибки Gradle-плагина.

🐸 Библиотека джависта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍 База по Spring Boot

🔹
@Transactional — оборачивает метод в транзакцию

@Transactional
public void saveData(Entity entity) {
repository.save(entity);
}


Автооткат при исключениях, но не ловит checked-исключения без rollbackFor = Exception.class.

🔹 @Async — делает метод асинхронным

@Async
public CompletableFuture<String> fetchData() {
return CompletableFuture.completedFuture("Hello");
}


Использует TaskExecutor, но не забываем про конфиг @EnableAsync.

🔹 @RestControllerAdvice — глобальный хендлер ошибок

@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleException(RuntimeException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
}
}


Вместо тонны try-catch обрабатываем ошибки централизованно.

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❗️Вакансии «Библиотеки программиста» — ждем вас в команде!

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

Подробности тут

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
Сохраняйте шпаргалку по командам docker compose

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM