Библиотека джависта | Java, Spring, Maven, Hibernate – Telegram
Библиотека джависта | Java, Spring, Maven, Hibernate
23.1K subscribers
2.27K photos
49 videos
46 files
3.24K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://news.1rj.ru/str/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
🔥 Field vs Constructor Injection: зомби-объекты в production

Казалось бы, избитая тема. Но копните глубже @Autowired — и обнаружите, что ваши объекты после new существуют в состоянии "клинической смерти".

Автор разбирает не "удобство тестов" (это мелочи), а фундаментальные проблемы: нарушение контракта конструктора, проблемы с JMM, хрупкость при AOT-компиляции для GraalVM, race conditions в мультипоточке.

Рекомендую прочитать, если хотите понять почему Spring Framework 6 окончательно выбрал constructor injection, а не просто "так все делают".

🔗 Читайте подробнее

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#coreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5👏2
😮 Топ-вакансий для джавистов за неделю

Backend Engineer (Java/Kotlin) — от 600 до 3 500 $ — офис (Минск)

Middle Java-разработчик — 240 000 - 260 000₽ — удалёнка

Java Developer — от 5 000 $ — удалёнка

➡️ Еще больше топовых вакансий — в нашем канале Java jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3👏1
«Этот манёвр будет стоить нам 51 год...»

— или 20% от вашего бюджета на самообразование. В Java-мире архитектурные паттерны и алгоритмы — это то, что отличает мидла от сеньора. Не ждите особого случая, забирайте базу прямо сейчас.

Успейте купить курсы Proglib Academy по старой цене до понедельника:

— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования

Взять по старой цене

⚠️ Цены вырастут 19 января
1
Structured Concurrency API — кто-то юзает в проде?

Наш подписчик спрашивает:

Перешли на Java 21, Virtual Threads зашли отлично. Теперь смотрю на Structured Concurrency API (JEP 462, пока в preview).
У нас классика: один запрос → параллельно дергаем несколько микросервисов → агрегируем ответ. Structured Concurrency пока preview feature. Стоит ли уже переходить или рано?


💬 Кто-то пробовал в реальных проектах? Какие впечатления?

P.S. Если хотите задать вопрос, заполните нашу гугл-форму. Это займет 5 минут.

🐸 Библиотека джависта

#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔21🔥1
👑 Магия IntelliJ IDEA: Structural Search & Replace

Рефакторишь проект, нужно найти все места, где используется deprecated метод с определённым паттерном вызова. Ctrl+F не поможет — он ищет текст, а не структуру кода. Для этого есть SSR.

🔹 Что это

Structural Search — поиск по AST-дереву кода, а не по тексту. Ищешь паттерны: методы с конкретными параметрами, переменные определённого типа, цепочки вызовов. И сразу заменяешь на новый код.

🔹 Как открыть

— Ctrl+Shift+A → "Structural Search" или "Structural Replace".
— Edit → Find → Search/Replace Structurally.
— Или Ctrl+Shift+F → переключись на вкладку "Structural".

🔹 Готовые шаблоны

IDEA поставляется с десятками шаблонов:
— Existing templates → Java → видишь примеры для логирования, коллекций, исключений.
— Можешь скопировать и доработать под себя.

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

— Рефакторинг legacy за минуты вместо часов.
— Находишь bug patterns (например, забытые null-checks).
— Автоматизируешь code review — проверяй стандарты кода.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3👏1
System.out.println(«Final call»)

Завтра мы повышаем стоимость всех курсов. Успейте сегодня выделить память под развитие, пока прайс не совершил прыжок.

Выделить ресурсы под профессиональный рост
😁7👍21
🔧 Ускоряем Spring-приложение: кэш для @PathVariable и @RequestParam

В Spring MVC по умолчанию каждый запрос вызывает полный резолвинг аргументов методов контроллера через рефлексию. Но можно включить кэширование метаданных параметров через spring.mvc.argument-resolvers.cache-size.

Это особенно полезно при высоконагруженных API с большим количеством path/query параметров.

spring:
mvc:
argument-resolvers:
cache-size: 256
# Включает кэш для резолверов аргументов (PathVariable, RequestParam и т.д.)
# 256 — разумный размер для большинства приложений


🔹 Что это даёт:

→ Меньше overhead на рефлексию при каждом запросе
→ Заметный прирост производительности на эндпоинтах с 5+ параметрами
→ Особенно эффективно в микросервисах с REST API

🔹Подводные камни:

→ Память займёт немного больше (но обычно незначительно)
→ При очень динамичных контроллерах (runtime-генерация) может потребоваться настройка размера кэша

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍6👏1
Можно ли переопределить статический метод?

Нет, статические методы не переопределяются (override), они скрываются (hide).

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

class Parent {
static void test() { System.out.println("Parent"); }
}
class Child extends Parent {
static void test() { System.out.println("Child"); }
}

Parent obj = new Child();
obj.test(); // Выведет "Parent"


Статические методы принадлежат классу, а не объекту, поэтому полиморфизм на них не работает.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123🔥2
🔬 Утечка, которую не видит heap dump

Интересная ловушка: вызываешь string.intern() на динамических строках, приложение падает с OOM, делаешь heap dump — а там всё чисто. Где утечка?

🔹 Суть проблемы

String Pool до Java 7 жил в PermGen, с Java 7 переехал в heap. Казалось бы, проблема решена. Но нет.

Внутри String Pool использует нативную хеш-таблицу StringTable, которая живёт в native memory (вне heap). Когда ты делаешь intern(), в heap создаётся сама строка, но ссылка на неё хранится в нативной StringTable.

🔹 Что происходит

Строки попадают в heap (GC их уберёт), но StringTable в native memory растёт бесконечно. Размер StringTable фиксирован и задаётся -XX:StringTableSize. При переполнении — коллизии, деградация, OOM.

🔹 Как увидеть?

bashjcmd <pid> VM.stringtable


Или Native Memory Tracking:

bash-XX:NativeMemoryTracking=detail
jcmd <pid> VM.native_memory


Ищи раздел Symbol — там StringTable.

⚠️ String Pool — это не только heap. StringTable живёт в native memory, и это классическая офф-хип утечка.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#coreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥7👏2
🔧 ObjectMapper и timezone: настройка обработки дат без указания зоны

При десериализации дат в формате "2024-01-15T10:00:00" без явной таймзоны Jackson по умолчанию использует UTC. Это может привести к неожиданным результатам при работе с ZonedDateTime или Instant, когда приложение работает в другой временной зоне.

🔵 Решение

▪️ Настройка ObjectMapper через Jackson2ObjectMapperBuilderCustomizer:

@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> builder
.timeZone(TimeZone.getDefault())
.featuresToDisable(
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
);
}


Jackson будет использовать системную таймзону приложения вместо UTC. Актуально для микросервисной архитектуры при обмене timestamp'ами между сервисами.

▪️ Для явного указания таймзоны:

java.timeZone(TimeZone.getTimeZone("Europe/Moscow"))


══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Enterprise AI: внедрение RAG в Java-экосистему

23 января в 19:00 на открытом уроке к курсу «Разработка ИИ агентов» разберём, как научить LLM работать с корпоративными знаниями без утечек и ошибок. Обсудим архитектуры RAG и методы Fine-tuning для реализации сложных Enterprise-решений.

Спикер — Игорь Стурейко, тимлид в «Газпроме» и AI-архитектор на Kubernetes. В видеосообщении Игорь делится опытом построения агентных систем и рассказывает, что ждёт студентов на курсе подготовки архитекторов ИИ.

На уроке разберём:

— принципы работы Retrieval-Augmented Generation в закрытом контуре;
— обзор инструментов для интеграции LLM в промышленный стек;
— работу с векторными индексами (FAISS, Chroma) для быстрого поиска.

📅 Когда: 23.01 в 19:00 МСК

Узнать подробности
😮 Топ-вакансий для джавистов за неделю

Java Developer — офис (Новосибирск)

Java Developer — 230 000 —‍ 240 000 ₽ — удалёнка

Java Developer — гибрид (Алматы)

➡️ Еще больше топовых вакансий — в нашем канале Java jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥1😁1
🔍 Просто о сложном: Pessimistic vs Optimistic Locking

Блокировки — способ контролировать одновременный доступ к данным. Два подхода: пессимистичный (блокируем заранее) и оптимистичный (проверяем при сохранении).

Простыми словами: пессимист говорит "займи очередь до конца", оптимист — "иди делай, потом проверим, не опередил ли кто-то".

🔹 Ключевые моменты

▪️ Pessimistic Lock — блокирует запись в БД на время транзакции (SELECT FOR UPDATE).
▪️ Optimistic Lock — проверяет версию при UPDATE, если изменилась — бросает исключение.
▪️ Пессимистичный подход безопаснее, но медленнее и может создавать deadlock'и.
▪️ Оптимистичный быстрее, но требует обработки конфликтов в коде.
▪️ В JPA: @Lock(PESSIMISTIC_WRITE) vs @Version.

🔹 Подводные камни

— Pessimistic lock держит соединение с БД — при долгих операциях можно исчерпать connection pool.
— Deadlock'и при неправильном порядке блокировок разных таблиц.
— Optimistic lock требует retry-логики на уровне приложения.
@Version не работает с native queries — только через JPQL/Criteria.
— В высоконагруженных системах оптимистичные блокировки могут давать слишком много конфликтов.

✔️ Когда использовать Pessimistic

— Операции с деньгами, где конфликт недопустим.
— Высокая вероятность конкурентного доступа к одной записи.
— Критичные бизнес-процессы (бронирование последнего товара).
— Короткие транзакции с гарантией успеха.

✔️ Когда использовать Optimistic

— Низкая вероятность конфликтов (разные пользователи редко трогают одну запись).
— Долгие транзакции или работа через UI (пользователь открыл форму, долго думает).
— Микросервисная архитектура — меньше нагрузка на БД.
— Batch-операции, где можно переобработать failed записи.

🔧 Бонус-трюк: комбинируйте подходы. Например, optimistic lock для UI-операций (пользователь редактирует профиль) + pessimistic для критичных API endpoints (списание средств). В одном приложении могут жить оба паттерна.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3👏1