Библиотека джависта | 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
加入频道
📌 Оптимизация Dependency Injection в Spring

Spring управляет созданием бинов через Dependency Injection (DI), но при большом количестве компонентов это замедляет запуск приложения и расходует память.

Используйте @Lazy, чтобы откладывать создание бина до первого вызова:
@Component
public class Component {

@Lazy
@Autowired
private Service service;
}


🔹 Когда применять


— Редко используемые сервисы (например, отчёты, аналитика).
— В крупных приложениях с тысячами зависимостей.
— В микросервисах для уменьшения потребления ресурсов.
— При загрузке тяжёлых конфигураций.
Please open Telegram to view this post
VIEW IN TELEGRAM
Документация PostgreSQL — лучший источник знаний о СУБД. Но она отличается огромным объемом: не каждый разработчик осилит 3024 страницы формата А4.

Опытный бэкендер составил список самых важных сведений, которые ему самому хотелось бы знать перед началом работы с PostgreSQL. Эта подборка сэкономит вам несколько недель изучения документации, и скорее всего, пригодится для работы с другими СУБД.

👉 Список самого важного
🛡 Поздравляем доблестных стражей Java:

▪️ Maven — ветеран dependency-войск. Качает половину интернета при первой сборке, потому что «вдруг понадобится».

▪️ Spring Boot — генерал магической дивизии. «Просто добавь @Annotation и оно заработает».

▪️ Garbage Collector — главный санитар JVM-фронта. Прибирается в куче и внезапно останавливает весь Java-мир.

Какого защитника выбираете вы? Пишите в комментариях 👇
🕯 Живая телеметрия без overhead

Если вам нужно анализировать производительность приложения в реальном времени, но профилировщики вроде VisualVM или async-profiler слишком тяжелые, то Java Flight Recorder (JFR) Event Streaming — ваш новый лучший друг.

JFR давно встроен в JVM и собирает метрики без ощутимого влияния на производительность (накладные расходы <1%). Раньше, чтобы получить данные, нужно было снимать дамп и разбирать его постфактум. Начиная с Java 14 пакет jdk.jfr.consumer предоставляет API, благодаря которому можно стримить события в реальном времени прямо в приложение.

🔹 Пример использования

Допустим, вы хотите следить за количеством вызовов System.gc() (или любыми другими JVM-событиями):
import jdk.jfr.consumer.*;

public class JfrStreamingExample {
public static void main(String[] args) {
try (var stream = EventStream.openRepository()) {
stream.onEvent("jdk.GarbageCollection", event ->
System.out.println("GC event: " + event.getLong("gcId"))
);
stream.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}

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

▪️ EventStream.openRepository() — подключается к JFR и слушает события онлайн
▪️ onEvent("jdk.GarbageCollection", callback) — подписывается на сборку мусора
▪️ stream.start(); — запускает стриминг

🔹 Где полезно

1️⃣ Мониторинг продакшена — следите за GC, JIT-компиляцией, блокировками потоков без перезапуска JVM.
2️⃣ Анализ нагрузки — получайте данные о CPU, аллокациях памяти, I/O в реальном времени.
3️⃣ Трассировка медленных запросов — находите узкие места без включения дорогих профилировщиков.

🔹 Что нужно знать

▪️ Работает без agent'ов и почти без overhead.
▪️ Доступно из коробки в OpenJDK 14+.
▪️ Встроенные события JVM уже можно стримить, но для своих нужно создать Custom JFR Events.

💬 Вы уже пробовали JFR Event Streaming?
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Фидбэк vs токсичность: как давать обратную связь коллегам и начальству

Задумывались ли вы, как превратить обратную связь из источника стресса в инструмент роста? Ведь неудачно сказанное слово может подорвать доверие в команде, тогда как конструктивный фидбэк способен вдохновить на новые достижения. Важно не только что мы говорим, но и как мы это делаем.

🔗 Подробнее в статье
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Maven vs Gradle

🔹 Maven — это инструмент сборки, использующий XML-конфигурацию (pom.xml). Популярен в Java-мире и часто применяется в корпоративных проектах.

✔️ Преимущества

— Чёткая структура проекта и стандартизация.
— Огромное количество доступных плагинов.
— Репозитории (Maven Central) делают управление зависимостями удобным.

Недостатки

— XML-файлы могут раздуваться и становиться громоздкими.
— Скорость сборки ниже по сравнению с Gradle.
— Сложнее писать кастомные задачи (Goals).

🔹 Gradle — современный инструмент сборки, использующий декларативный стиль (build.gradle.kts или build.gradle). Часто применяется в Android-разработке и для микросервисов.

✔️ Преимущества

— Поддерживает Groovy и Kotlin DSL.
— Более быстрая сборка благодаря инкрементальному билду и кэшированию.
— Меньше кода в конфигурации по сравнению с Maven.

Недостатки

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

👍🏼 — Maven, 🔥 — Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
Найти работу теперь так же просто, как заказать такси 🚗

Представь, что поиск работы стал таким же удобным, как вызов такси.

1️⃣ Регистрируешься за 2 минуты
2️⃣ Проходишь AI-интервью в любое время
3️⃣ Получаешь персональные вакансии и пре-офер от Сбера

💡 Без стресса, без ожидания, без звонков "через недельку" – просто бери и делай!

🔗 Попробуй прямо сейчас! 👉 https://clc.to/GkOTTA

Реклама. ПАО СБЕРБАНК, ИНН 7707083893. Erid 2VtzqxUqFAv
В чем разница между map() и flatMap()?

Оба метода используются для трансформации данных в Stream, но с ключевыми отличиями:

▪️ map(Function<T, R>) применяет функцию к каждому элементу потока и возвращает поток с преобразованными элементами (Stream<R>).

▪️ flatMap(Function<T, Stream<R>>) делает то же самое, но ожидает, что функция вернет Stream<R>, а затем "выпрямляет" вложенные потоки в один Stream<R>.

📌 Пример:
List<String> words = List.of("Hello", "World");

// map(): превращает каждое слово в список символов
List<List<Character>> mapped = words.stream()
.map(word -> word.chars()
.mapToObj(c -> (char) c)
.toList())
.toList();

// flatMap(): превращает каждое слово в поток символов и "сплющивает" их в один поток
List<Character> flatMapped = words.stream()
.flatMap(word -> word.chars()
.mapToObj(c -> (char) c))
.toList();

System.out.println(mapped); // [[H, e, l, l, o], [W, o, r, l, d]]
System.out.println(flatMapped); // [H, e, l, l, o, W, o, r, l, d]
Please open Telegram to view this post
VIEW IN TELEGRAM
🔼 Улучшаем работу с Optional

Все используют Optional, но не все знают, как сделать это лучше. Нередко можно встретить такой код:
Optional<User> userOpt = findUserById(id);
if (userOpt.isPresent()) {
User user = userOpt.get();
processUser(user);
}


Такой код не только избыточен, но и может привести к NoSuchElementException, если забыть проверить isPresent(). Поэтому лучше использовать ifPresent(), чтобы оптимизировать код:
findUserById(id).ifPresent(this::processUser);

📌 Какие ещё варианты

— Для выполнения действия, если значение есть (ifPresent()).
— Для подстановки дефолтного значения (orElse() / orElseGet()).
— Для обработки исключений (orElseThrow()).

⚠️ Плохие практики

▪️ Использовать Optional в качестве аргументов методов — это ломает читаемость API.
▪️ Использовать Optional.get() без проверки — это сводит всю пользу Optional на нет.
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 Почему увольнять программистов ради ИИ — путь к провалу

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

➡️ Что внутри статьи

▪️ Почему новые поколения программистов рискуют потерять ключевые навыки.

▪️ Как компании, заменившие инженеров ИИ, столкнутся с серьезными проблемами.

▪️ Почему опытные разработчики станут супердорогими и востребованными.

▪️ К чему приведет полная ставка на искусственный интеллект в IT.

🔵 Подтяните свои знания о машинном обучении вместе с нашим курсом «Базовые модели ML и приложения»

🔗 Читайте статью
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой AI-инструмент вы используете?

🔥 ChatGPT
👍🏼 DeepSeek
⚡️ GitHub Copilot
❤️ ЯндексГпт
👾 Я пишу код сам, без AI
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
WeakHashMap

WeakHashMap — это хеш-таблица, в которой ключи хранятся через слабые ссылки (WeakReference). Это значит, что если на ключ нет сильных ссылок, он становится кандидатом на удаление при следующем проходе GC.

🔹 Как работает GC с WeakHashMap

GC удаляет только ключи, на которые больше нет сильных ссылок. Значения же остаются в памяти, пока WeakHashMap не изменится (put(), remove()). Можно использовать ReferenceQueue, чтобы отслеживать удалённые ключи.

🔹 Когда используется


— Кеширование данных, которые можно безопасно сбрасывать.
— Хранение метаданных объектов без риска утечек памяти.
— Уменьшение давления на GC в высоконагруженных системах.

🔹 Отличие от HashMap

В HashMap ключ останется в памяти, пока его явно не удалят. В WeakHashMap ключ исчезнет автоматически, если на него нет ссылок.

⚠️ Когда НЕ стоит использовать

— Если кеш должен сохранять данные долго.
— Если ключи неизменяемые (String из пула строк, Integer), GC их не удалит.
— Если нужна предсказуемость хранения — WeakHashMap не гарантирует срок жизни ключей.

💬 Используете WeakHashMap в проде?
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Твоя БД скоро станет умнее тебя: 5 трендов open-source баз данных 2025

БД перестают быть просто хранилищем — теперь они оптимизируют запросы, автоматически анализируют данные и даже используют AI для прогнозов.
Какие фичи перевернут мир open-source БД в 2025? Узнайте в статье👇

🫢 Прочитать статью

🐸Библиотека devops'a
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM