Библиотека джависта | 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
加入频道
️ Если вы вдруг забыли: у нас можно купить рекламу

Библиотека программиста — медиа с миллионной аудиторией из IT-сферы. Что у нас есть:

• 60+ телеграм-каналов по разным IT-направлениям, от Python до DevOps

• 25 000 daily active users на сайте, который поможет усилить продвижение

• Возможность сделать нативную интеграцию, виральный пост и не только

За айтишной аудиторией — к нам 😏

По вопросам рекламы пишите сюда → @proglib_adv
💬 На чём пишете бэк?

🔥 — Spring Boot
👾 — Quarkus
🎉 — Micronaut
⚡️ — Jakarta EE
🤔 — Другое, напишу в комментах
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️Redis — не единственный выбор: 3 достойные замены

Redis — это мощный инструмент для работы с данными в памяти, который часто используется как кэш, база данных или брокер сообщений. Однако в некоторых случаях другие решения могут оказаться более подходящими. Вот три альтернативы Redis, которые заслуживают внимания:

1️⃣ Dragonfly

Dragonfly — это современное высокопроизводительное хранилище данных в памяти, которое позиционируется как замена Redis. Оно предлагает лучшую производительность и масштабируемость, особенно для задач с высокой нагрузкой. Dragonfly поддерживает протокол Redis, что делает переход на него практически безболезненным.

Плюсы:

Высокая производительность

Полная совместимость с Redis

Эффективное использование ресурсов.

2️⃣ KeyDB

KeyDB — это многопоточная версия Redis, которая использует несколько ядер процессора для повышения производительности. Он полностью совместим с Redis, поэтому вам не придется переписывать код при переходе.

Плюсы:

Многопоточность для лучшей производительности

Простота миграции с Redis

Поддержка всех основных функций Redis.

3️⃣ Memcached

Memcached — это классическое решение для кэширования данных в памяти. Оно простое, надежное и отлично подходит для задач, где требуется высокая скорость доступа к данным. Хотя Memcached уступает Redis в функциональности, он остается популярным выбором для кэширования.

Плюсы:

Простота и минимализм

Высокая скорость работы

Широкая поддержка в экосистеме.

🐸Библиотека devops'a
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ MapStruct: быстрый и безопасный маппинг объектов

⚙️ Как это работает

MapStruct анализирует названия полей в исходном (source) и целевом (target) классах. Если поля совпадают по названию и типу, он автоматически создаёт код для их преобразования.

Когда названия полей не совпадают, нужно явно указать соответствие с помощью аннотации @Mapping:

— source — поле в исходном классе
— target — поле в целевом классе

@Mapping(source = "fullName", target = "name")
UserDTO toDTO(User user);


Как начать

1. Добавьте зависимости: mapstruct, mapstruct-processor

2. Выберите интерфейс или абстрактный класс и определите методы для преобразования объектов

3. Используйте маппер. В Spring-приложении маппер можно заинжектить как обычный бин.

Абстрактный класс или интерфейс

Документация MapStruct приводит примеры с интерфейсами, но библиотека поддерживает и абстрактные классы. Выбор за вами.

Интерфейс — MapStruct сам создаёт реализацию:
@Mapper(componentModel = "spring")
public interface UserMapper {
@Mapping(source = "fullName", target = "name")
UserDTO toDTO(User user);
}


Абстрактный класс — позволяет добавлять кастомную логику:
@Mapper(componentModel = "spring")
public abstract class UserMapper {
@Mapping(source = "fullName", target = "name")
public abstract UserDTO toDTO(User user);

public String mapAgeToString(int age) {
return age + " лет";
}
}


📌 Имена методов можно задавать любые. MapStruct анализирует типы аргументов и возвращаемых значений, чтобы понять, что куда маппить.

🔥 Интеграция со Spring

При использовании componentModel = "spring" маппер регистрируется как Spring-бин. Что позволяет заинжектить маппер:
@Service
public class UserService {
private final UserMapper userMapper;

public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}

public UserDTO convertUser(User user) {
return userMapper.toDTO(user);
}
}


💡 Где применять

— Маппинг DTO ↔️ Entity в Spring-приложениях
— Конвертация данных между разными объектами
— Обработка вложенных структур и коллекций

💬 Используете MapStruct в своих проектах? Делитесь опытом
Please open Telegram to view this post
VIEW IN TELEGRAM
☢️ Как не попасть в токсичную компанию: чек-лист для айтишника

C офферами от Сбера, Вконтакте, Яндекса и других айтишных гигантов все понятно — это стабильные компании, работать в которых мечтают многие.

Но вот что делать, если вас зовут работать в ноунейм-компанию, при этом предлагают з/п сильно выше рынка, полную удаленку и 100500 «плюшек»?

Рассказываем, как проверить будущего работодателя и не оказаться в компании-однодневке с невыплатами зарплаты и токсичной культурой.

👉 Читать статью
🔍 Что такое Virtual Threads

В Java 21 появилась революционная фича — виртуальные потоки (Virtual Threads). Это лёгкие потоки, которые управляются самой JVM, а не операционной системой. Они позволяют создавать тысячи и даже миллионы потоков без значительных затрат ресурсов.

⚙️ Как это работает

Обычные потоки (Thread) привязаны к потокам ОС и работают с тяжёлым контекстным переключением (context switching).

Virtual Threads — это user-mode потоки, управляемые JVM, а не ОС, поэтому они могут эффективно мультиплексироваться на ограниченном количестве платформенных потоков.

🔹 Ключевая особенность

Виртуальные потоки не блокируют платформенные потоки, когда выполняют блокирующие операции ввода-вывода (I/O). Они просто освобождают платформенный поток и продолжают выполнение, когда ресурс снова доступен.

Пример

public class VirtualThreadsDemo {
public static void main(String[] args) throws InterruptedException {
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10_000).forEach(i ->
executor.submit(() -> {
System.out.println("Task " + i + " running on " + Thread.currentThread());
Thread.sleep(100);
})
);
}
}
}


Этот код создаёт 10 000 потоков, но JVM будет эффективно управлять ими без перегрузки системы.

✔️ Где применять

— Высоконагруженные I/O задачи.
— Обработка веб-запросов без перегрузки ресурсов.
— Микросервисы, которые взаимодействуют с API.
— Асинхронные операции, где ранее использовали CompletableFuture.

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

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

ℹ️ Преимущества и недостатки

— Плюсы: миллионы потоков без overhead, упрощённый асинхронный код без CompletableFuture, меньше блокировок и выше производительность, полная совместимость со старыми API.
— Минусы: может ломать старый код с synchronized, не даёт преимуществ для CPU-bound задач, требует оптимизации библиотек под Virtual Threads.

Virtual Threads — мощный инструмент, который не заменяет потоки ОС, но отлично подходит для массовых I/O-задач. Если у вас есть сервис, работающий с сетью, базами данных или API — пора внедрять Virtual Threads.

💬 Делитесь опытом работы с виртуальными потоками
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Quartz уже не тот? Современные альтернативы для планирования задач

Quartz долгое время считался стандартом для планирования задач. Однако с течением времени появились более современные и эффективные альтернативы.

Например, такие инструменты, как JobRunr и db-scheduler, предлагают более простые API, лучшую производительность и встроенные возможности мониторинга.

🔗 Подробнее в статье
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Подпишись на нашу еженедельную email-рассылку, чтобы быть в курсе последних открытий и тенденций в мире бэкенда.

В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования

👉Подписаться👈
#дайджест #Javadevjob

Вакансии Java разработчиков уровня Junior

▪️ Java Developer
Удалёнка / Офис (Москва, Новосибирск), Динамика

▪️ Backend Java-разработчик
Офис (Череповец), BIV

Вакансии Java разработчиков уровня Middle

▪️ Java-разработчик
Гибрид (Москва), Онлайн-кинотеатр Иви

▪️ Java-разработчик
Офис (Томск), Банк России

Вакансии Java разработчиков уровня Senior

▪️ Java Developer
Офис (Пермь) / Удалёнка, Galileosky

▪️ Java-разработчик
Гибрид (Москва), Санкт-Петербургская Международная Товарно-сырьевая Биржа

Понравились вакансии?
❤️ — да
🤔 — нет
📚 ТОП-11 книг по базам данных в 2025 году

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

🔗 Читайте в статье
🔥 Лайфхак: оптимизируем DTO с record

Вместо обычных POJO-классов для DTO используйте record (Java 14+). Меньше кода, больше удобства.

Record автоматически создает иммутабельный класс с приватными финальными полями, конструктором, геттерами, а также переопределенными методами toString(), equals() и hashCode().

Избыточно
public class User {
private final String name;
private final int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() { return name; }
public int getAge() { return age; }

@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
User user = (User) obj;
return age == user.age && Objects.equals(name, user.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}


✔️ Красиво и лаконично
public record User(String name, int age) {}
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Как запускаете свои проекты?

🔥 — Через IDE
👾 — Через терминал
🎉 — В Docker-контейнере
⚡️ — В облаке
🤔 — Ещё не понял, как запускать
Please open Telegram to view this post
VIEW IN TELEGRAM
🕯 Паттерн Состояние (State)

State — это поведенческий паттерн, который позволяет объекту менять свое поведение в зависимости от внутреннего состояния. Вместо множества условных операторов (if-else или switch), каждое состояние представляется отдельным классом, а сам объект делегирует управление текущему состоянию.

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

🔹 Когда у объекта есть несколько состояний, и его поведение зависит от текущего состояния.
🔹 Когда код с if-else или switch начинает разрастаться и усложняет поддержку.
🔹 Когда необходимо четко разделить логику различных состояний и сделать систему более гибкой.

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

1️⃣ Избавляет от множества if-else конструкций, делая код более читаемым и поддерживаемым.
2️⃣ Облегчает добавление новых состояний без изменения существующего кода.
3️⃣ Обеспечивает инкапсуляцию логики для каждого состояния, упрощая тестирование и модификации.

Недостатки

1️⃣ Может усложнить код, если состояний слишком мало, а логика простая.
2️⃣ Увеличивает количество классов, так как каждое состояние реализуется отдельно.
3️⃣ Вводит дополнительные связи между классами состояний и контекстом.

State — мощный инструмент, когда объекту нужно динамически изменять свое поведение. Он особенно полезен в конечных автоматах, обработке пользовательских действий и моделировании процессов с четко определенными шагами.
Please open Telegram to view this post
VIEW IN TELEGRAM
Swipe right or swipe left

Что делать, если твои мэтчи в жизни не такие точные, как твой код?

Спокойно, 14 февраля в 19:00 по МСК мы разберём, как ML анализирует speed dating и предсказывает match.

📌 Мы возьмем реальные данные со speed dating.

📌 Обучим модель, которая скажет: match или swipe left.

📌 Разберём, какие признаки реально важны (спойлер: работа в IT — не прям гарантия успеха (наши маркетологи подтверждают 😥).

💡 Приходи, если хочешь прокачать свой Python, ML и, возможно, станешь идеальной парой, как самый стильные форсы.

👉 Записаться
Что такое микросервисы?

Микросервисы — это архитектурный стиль, при котором приложение разбивается на небольшие, независимые сервисы. Каждый сервис отвечает за определённую бизнес-логику, имеет собственную базу данных (или логически обособленное хранилище) и взаимодействует с другими сервисами через API (обычно REST или gRPC).

🔹 Ключевые принципы

Можно обновлять и масштабировать отдельные сервисы без затрагивания всей системы.
Каждый сервис выполняет свою узкую задачу.
У сервиса свои изолированные данные, код и зависимости.
Сервисы общаются через HTTP, AMQP, Kafka и другие механизмы.
Please open Telegram to view this post
VIEW IN TELEGRAM