es
Feedback
Библиотека Java разработчика

Библиотека Java разработчика

Ir al canal en Telegram

📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP

Mostrar más

📈 Análisis del canal de Telegram Библиотека Java разработчика

El canal Библиотека Java разработчика (@bookjava) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 10 222 suscriptores, ocupando la posición 11 888 en la categoría Tecnologías y Aplicaciones y el puesto 63 392 en la región Rusia.

📊 Métricas de audiencia y dinámica

Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 10 222 suscriptores.

Según los últimos datos del 13 julio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -45, y en las últimas 24 horas de -4, conservando un alto alcance.

  • Estado de verificación: No verificado
  • Tasa de interacción (ER): El promedio de interacción de la audiencia es 9.43%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 4.52% de reacciones respecto al total de suscriptores.
  • Alcance de las publicaciones: Cada publicación recibe en promedio 964 visualizaciones. En el primer día suele acumular 462 visualizaciones.
  • Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 7.
  • Intereses temáticos: El contenido se centra en temas clave como string, интерфейс, строка, boot, api.

📝 Descripción y política de contenido

El autor describe el recurso como un espacio para expresar opiniones subjetivas:
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP

Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 14 julio, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.

10 222
Suscriptores
-424 horas
-117 días
-4530 días
Atraer Suscriptores
julio '26
julio '26
+13
en 0 canales
junio '26
+46
en 0 canales
Get PRO
mayo '26
+64
en 0 canales
Get PRO
abril '26
+27
en 0 canales
Get PRO
marzo '26
+28
en 0 canales
Get PRO
febrero '26
+39
en 0 canales
Get PRO
enero '26
+43
en 1 canales
Get PRO
diciembre '25
+16
en 0 canales
Get PRO
noviembre '25
+72
en 31 canales
Get PRO
octubre '25
+47
en 1 canales
Get PRO
septiembre '25
+61
en 36 canales
Get PRO
agosto '25
+55
en 0 canales
Get PRO
julio '25
+63
en 27 canales
Get PRO
junio '25
+44
en 19 canales
Get PRO
mayo '25
+65
en 44 canales
Get PRO
abril '25
+90
en 38 canales
Get PRO
marzo '25
+78
en 38 canales
Get PRO
febrero '25
+100
en 31 canales
Get PRO
enero '25
+83
en 33 canales
Get PRO
diciembre '24
+116
en 34 canales
Get PRO
noviembre '24
+67
en 32 canales
Get PRO
octubre '24
+99
en 29 canales
Get PRO
septiembre '24
+131
en 28 canales
Get PRO
agosto '24
+97
en 18 canales
Get PRO
julio '24
+45
en 0 canales
Get PRO
junio '24
+99
en 23 canales
Get PRO
mayo '24
+234
en 18 canales
Get PRO
abril '24
+210
en 0 canales
Get PRO
marzo '24
+282
en 21 canales
Get PRO
febrero '24
+274
en 17 canales
Get PRO
enero '24
+329
en 23 canales
Get PRO
diciembre '23
+222
en 23 canales
Get PRO
noviembre '23
+117
en 16 canales
Get PRO
octubre '23
+136
en 18 canales
Get PRO
septiembre '23
+243
en 0 canales
Get PRO
agosto '23
+325
en 0 canales
Get PRO
julio '23
+322
en 0 canales
Get PRO
junio '23
+306
en 0 canales
Get PRO
mayo '23
+287
en 0 canales
Get PRO
abril '23
+271
en 0 canales
Get PRO
marzo '23
+603
en 0 canales
Get PRO
febrero '23
+153
en 0 canales
Get PRO
enero '23
+214
en 0 canales
Get PRO
diciembre '22
+206
en 0 canales
Get PRO
noviembre '22
+140
en 0 canales
Get PRO
octubre '22
+207
en 0 canales
Get PRO
septiembre '22
+226
en 0 canales
Get PRO
agosto '22
+288
en 0 canales
Get PRO
julio '22
+299
en 0 canales
Get PRO
junio '22
+278
en 0 canales
Get PRO
mayo '22
+315
en 0 canales
Get PRO
abril '22
+318
en 0 canales
Get PRO
marzo '22
+417
en 0 canales
Get PRO
febrero '22
+328
en 0 canales
Get PRO
enero '22
+245
en 0 canales
Get PRO
diciembre '21
+222
en 0 canales
Get PRO
noviembre '21
+172
en 0 canales
Get PRO
octubre '21
+323
en 0 canales
Get PRO
septiembre '21
+207
en 0 canales
Get PRO
agosto '21
+331
en 0 canales
Get PRO
julio '21
+310
en 0 canales
Get PRO
junio '21
+271
en 0 canales
Get PRO
mayo '21
+297
en 0 canales
Get PRO
abril '21
+328
en 0 canales
Get PRO
marzo '21
+419
en 0 canales
Get PRO
febrero '21
+436
en 0 canales
Get PRO
enero '21
+452
en 0 canales
Get PRO
diciembre '20
+7 112
en 0 canales
Fecha
Crecimiento de Suscriptores
Menciones
Canales
14 julio+2
13 julio0
12 julio+1
11 julio+2
10 julio0
09 julio+1
08 julio+1
07 julio+2
06 julio0
05 julio0
04 julio+1
03 julio0
02 julio+2
01 julio+1
Publicaciones del Canal
💡 Ленивая инициализация бинов в Spring Boot — мощный инструмент ускорения старта По умолчанию Spring инициализирует все singleton-бины при запуске приложения. Это может быть проблемой в больших проектах: старт медленный, а половина бинов не нужна сразу. 📌 Как ускорить старт и снизить потребление памяти? — Lazy Init! ✅ Глобально:

spring:
  main:
    lazy-initialization: true
Все бины станут ленивыми — создадутся только при первом обращении. Это может сократить старт приложения на 30-60%! ✅ Локально (избирательно):

@Component
@Lazy
public class HeavyBean {
    public HeavyBean() {
        System.out.println("HeavyBean init...");
    }
}
Или через @Lazy на зависимостях:

@Service
public class MyService {
    public MyService(@Lazy HeavyBean heavyBean) {
        this.heavyBean = heavyBean;
    }
}
🧠 Когда использовать: - В dev-окружении — чтобы ускорить локальный dev cycle. - В CLI/Batch-приложениях, где используется 1-2 бина. - Когда есть тяжёлые бины, не нужные на старте (например, интеграции, большие клиенты и т.п.). ⚠️ Осторожно: - Если забыть @Lazy на зависимостях, Spring всё равно создаст бин. - Некоторые бины должны быть загружены сразу (например, @Scheduled, @EventListener), иначе они не сработают. 📲 Мы в MAX 👉@BookJava

2
👩‍💻 DAO на Spring JDBC Приглашаем на открытый урок. 🗓 22 июля в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Разраб
👩‍💻 DAO на Spring JDBC Приглашаем на открытый урок. 🗓 22 июля в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework». На занятии мы разберем: ✔️Преимущества нативного SQL при разработке DAO. ✔️ Основные возможности Spring JDBC для работы с запросами. ✔️ Подходы к обеспечению безопасности и тестируемости DAO. Кому будет интересно: Урок будет полезен Java-разработчикам, архитекторам ПО и специалистам по базам данных, стремящимся оптимизировать доступ к данным. 🔗 Ссылка на регистрацию: https://vk.cc/cZxief Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
533
3
🧠 ThreadLocal — скрытая угроза утечек памяти ThreadLocal — удобный способ хранить данные, привязанные к потоку. Например, дл
🧠 ThreadLocal — скрытая угроза утечек памяти ThreadLocal — удобный способ хранить данные, привязанные к потоку. Например, для SimpleDateFormat или текущего пользователя в рамках запроса. Но с ним легко получить утечку памяти, особенно в thread pool'ах. 📌 Почему? ThreadLocal-хранилище (Thread.threadLocals) живёт столько же, сколько поток. А потоки из пулов живут долго. Если ты забыл вызвать remove() — данные останутся в памяти навсегда. Пример: private static final ThreadLocal<UserContext> context = ThreadLocal.withInitial(UserContext::new); public void handleRequest() { try { context.set(new UserContext("user123")); // работа с контекстом } finally { context.remove(); // ОБЯЗАТЕЛЬНО! } } ⚠️ Что пойдёт не так без remove()? - Поток из пула закончит обрабатывать запрос, но UserContext останется висеть в ThreadLocalMap этого потока. - Если UserContext содержит ссылки на другие объекты (например, HttpSession, EntityManager и т.д.) — вся эта цепочка не будет GC-шиться. - И так накапливается утечка. 💡 Советы: - Всегда вызывай remove() в finally. - Для Spring можно использовать RequestScope или @ControllerAdvice вместо ThreadLocal. - Проверяй код сторонних библиотек, если они используют ThreadLocal, особенно в фильтрах и интерсепторах. 📲 Мы в MAX 👉@BookJava
591
4
🧠 Как ускорить cold start Spring Boot приложения Как можно сократить время старта Spring Boot 3+ приложения — без GraalVM и
🧠 Как ускорить cold start Spring Boot приложения Как можно сократить время старта Spring Boot 3+ приложения — без GraalVM и без магии. 📌 Используем флаг: -Dspring.context.cache.applicationContext=true 💡 Что это такое? Это встроенный механизм кэширования ApplicationContext, появившийся в Spring Boot 3.2. Он сохраняет результат построения контекста и позволяет повторно использовать его между запусками, особенно в тестах и development-сценариях. ⚙️ Как работает: - При первом запуске контекст билдится как обычно. - Затем сериализуется и сохраняется на диск. - При следующем запуске он подгружается из кеша (если не изменился), что даёт ускорение в 2-3 раза и больше. 🚀 Отлично подходит для: - Тестов (@SpringBootTest); - Dev tools и локального запуска; - Разработки больших монолитов. ⚠️ Не влияет на продакшн (там кеш не используется по умолчанию) ⚠️ Не поддерживает все конфигурации (например, динамические настройки могут инвалидировать кеш) Простой флаг — а экономит кучу времени каждый день. 📲 Мы в MAX 👉@BookJava
743
5
🧠 Частая ловушка при работе с @Transactional в Spring Сейчас покажу вам один распространённый анти-паттерн, который легко пропустить — вызов транзакционного метода внутри того же класса. 📌 Пример: @Service public class UserService { @Transactional public void registerUser(UserDto dto) { saveUser(dto); } @Transactional public void saveUser(UserDto dto) { // сохранение пользователя } } 💥 Проблема: Spring не применит транзакцию к saveUser(), потому что вызов происходит внутри одного и того же бина — минуя прокси. Spring AOP работает через прокси, и @Transactional "срабатывает", только если метод вызывается извне, через прокси-объект. ⚠️ Это может привести к очень странным багам: вы думаете, что транзакция есть, а её нет. 💡 Как исправить: 1. Вынести метод в отдельный бин: @Service public class UserSaver { @Transactional public void save(UserDto dto) { // сохраняем } } @Service public class UserService { private final UserSaver saver; public UserService(UserSaver saver) { this.saver = saver; } public void registerUser(UserDto dto) { saver.save(dto); } } 2. Или использовать TransactionTemplate вручную. ✅ Всегда проверяйте, как вызываются методы с @Transactional. Особенно при рефакторинге! 📲 Мы в MAX 👉@BookJava
827
6
👩‍💻 Стоит ли учить Java в 2026: куда движется язык и где работают джависты Приглашаем на открытый урок. 🗓 16 июля в 20:00
👩‍💻 Стоит ли учить Java в 2026: куда движется язык и где работают джависты Приглашаем на открытый урок. 🗓 16 июля в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик». Программа урока: ✔️ Развенчиваем главный миф новичка: правда ли, что «Java умерла» и всем надо идти в Python или Go ✔️ Где Java реально работает в 2026: банки, финтех, маркетплейсы, стриминги с миллионами пользователей, логистика ✔️ Big Data на JVM: почему Kafka, Spark и Hadoop написаны на Java и зачем это знать даже питонисту ✔️ Куда движется язык: релизы каждые полгода, борьба с многословностью, нативная компиляция (GraalVM), связка с AI ✔️ Карьера джависта: зарплаты, стабильность и почему этот язык — фундамент для долгого пути в IT 🔗 Ссылка на регистрацию: https://vk.cc/cZloUh Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
863
7
🧠 @Value vs @ConfigurationProperties — кого выбрать? Часто вижу, как даже опытные разработчики по привычке используют @Value для инъекции конфигурации: @Value("${app.timeout}") private Duration timeout; ⚠️ Но с ростом приложения @Value становится хрупким и неудобным. 📌 Лучший подход — использовать @ConfigurationProperties: @ConfigurationProperties(prefix = "app") public record AppProperties(Duration timeout, String apiKey) {} @Bean @ConfigurationPropertiesBinding public AppProperties appProperties() { return new AppProperties(); } ✅ Преимущества @ConfigurationProperties: - 💡 Группирует настройки логически - 🔍 Работает с валидацией (@Validated, @NotNull, и т.д.) - 📚 Отлично поддерживается IDE (автокомплит, рефакторинг) - 🔧 Удобно тестировать и мокать 🆕 Начиная с Spring Boot 2.2+, можно использовать record-классы и просто зарегистрировать бин через @EnableConfigurationProperties: @Configuration @EnableConfigurationProperties(AppProperties.class) public class AppConfig {} Так что, если у вас в проекте до сих пор десятки @Value — самое время навести порядок. 📲 Мы в MAX 👉@BookJava
823
8
🧠 @Value в Spring — это ловушка, если вы используете списки или map'ы Многие знают, что можно заинжектить список строк из application.yml вот так: app: langs: - en - fr - de @Value("${app.langs}") private List<String> langs; Но знаете, что вы получите? ⚠️ ОШИБКУ. @Value не умеет парсить YAML-массивы. Он ожидает строку, и даже с CSV-строкой (en,fr,de) — всё не так очевидно: Spring не применяет ConversionService для списков. 📌 Решение — использовать @ConfigurationProperties: app: langs: - en - fr - de @ConfigurationProperties(prefix = "app") @Component public class AppProps { private List<String> langs; // геттеры/сеттеры } 💡 Профит: - работает с List, Map, вложенными объектами; - валидация через @Validated и @NotEmpty; - легко покрыть тестами; - меньше магии. ⚠️ @Value хорош для простых скаляров. Всё остальное — через @ConfigurationProperties. 📲 Мы в MAX 👉@BookJava
1 116
9
🔍 Почему Optional — это не замена null везде и всегда Привет! Сегодня хочу поделиться одной из часто встречающихся ошибок при использовании Optional в Java. Многие разработчики, особенно начинающие, начинают использовать Optional везде, где может быть null, думая, что это автоматически делает код "безопасным". Но так ли это? 📌 Ключевая идея Optional — сигнализировать о возможном отсутствии значения в результате вызова метода. А не заменять все поля и параметры на Optional. Примеры плохой практики: public class User { private Optional<String> name; // ❌ Не нужно так делать } Почему это плохо: - Увеличивается сложность сериализации (особенно с Jackson, GSON). - Не соответствует архитектурной задумке: Optional — это не контейнер для полей. - Проблемы с JPA (Hibernate не дружит с Optional-полями). - Понижается читаемость кода. 💡 Лучше использовать Optional вот так: public Optional<User> findUserById(Long id) { // Возвращаем Optional, потому что пользователь может не существовать } То есть Optional — это про контракт на метод, а не про хранение данных. Если кратко: - ✅ Используй Optional в сигнатурах методов, когда результат может отсутствовать. - ❌ Не используй Optional в полях и параметрах конструктора. А ты как используешь Optional в проектах? Был ли опыт с его неправильным применением? Пиши в комментах👇 📲 Мы в MAX 👉@BookJava
1 049
10
👩‍💻 Как работает @Transactional в Spring: границы транзакций и типовые ошибки Приглашаем на открытый урок. 🗓 29 июня в 20:
👩‍💻 Как работает @Transactional в Spring: границы транзакций и типовые ошибки Приглашаем на открытый урок. 🗓 29 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework». На занятии мы разберем: ✔️Что реально делает @Transactional в Spring ✔️Почему важны proxy и вызов метода через Spring Bean ✔️Как работают propagation-режимы на примере REQUIRED и REQUIRES_NEW ✔️Когда происходит rollback и почему checked exceptions не всегда откатывают транзакцию ✔️Типовые ошибки при работе с транзакциями в сервисном слое Урок будет полезен Java/Kotlin-разработчикам, которые уже пишут приложения на Spring или начинают использовать Spring в реальных backend-проектах и хотят лучше понимать поведение транзакций. 🔗 Ссылка на регистрацию: https://vk.cc/cZ9GGY Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
992
11
🧠 Как Java хранит boolean в памяти? Сегодня я покажу вам, почему boolean в Java — это не просто true или false. А за этим простым типом скрывается интересный нюанс, особенно если ты задумываешься об экономии памяти. В Java нет отдельного типа, который занимает всего 1 бит. Хотя логично было бы ожидать, что boolean — это один бит (true/false), на самом деле в памяти он занимает 1 байт (а иногда и больше, в зависимости от структуры объекта). Пример: public class Flags { boolean flag1; boolean flag2; boolean flag3; } Ты думаешь — три бита. Но JVM выравнивает поля, и из-за этого объект может занимать 16 байт или больше, в зависимости от архитектуры. Почему так? 📌 Причина: JVM упрощает модель памяти ради производительности — доступ к байтам быстрее, чем к битам. Нет битовых сдвигов, масок и лишней логики. 💡 Что делать, если хочется сэкономить память? Используй BitSet: BitSet flags = new BitSet(3); flags.set(0, true); Это уже реальная битовая структура. Отличный выбор, если у тебя десятки или сотни логических флагов. А ты знал об этом нюансе хранения boolean? Пиши в комментариях, сталкивался ли с перерасходом памяти из-за простых типов. 📲 Мы в MAX 👉@BookJava
936
12
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
696
13
🎯 Как Java находит классы? Под капотом ClassLoader'ов Сечас покажу вам одну из самых недооценённых тем в мире Java — механизм загрузки классов. Когда ты запускаешь Java-приложение, оно не просто «видит» все классы. За кулисами работает цепочка загрузчиков: 1. Bootstrap ClassLoader Самый базовый. Загружает классы из JDK (rt.jar, java.base, и так далее). На него даже нельзя получить ссылку в коде. 2. Platform ClassLoader (ранее Extension) Загружает модули платформы (jmods), доступные из JDK, но не из java.base. 3. Application ClassLoader Твой лучший друг. Он отвечает за загрузку классов из classpath (например, target/classes и lib/*.jar). Но вот где начинается магия — ты можешь создать собственный ClassLoader и загружать классы в рантайме из файлов, БД или даже сети. Например: ClassLoader customLoader = new URLClassLoader(new URL[]{new File("plugins/").toURI().toURL()}); Class<?> pluginClass = customLoader.loadClass("com.example.PluginImpl"); 💡 Это используется в плагинных системах (например, IntelliJ, Jenkins, Minecraft). Но будь осторожен — неправильная работа с загрузчиками может привести к ClassCastException, даже если классы выглядят одинаково. 📲 Мы в MAX 👉@BookJava
879
14
Понимание разницы между Error и Exception в Java ✅ Что такое Error в Java? - Error (ошибка) в Java представляет собой серьёзн
Понимание разницы между Error и Exception в Java ✅ Что такое Error в Java? - Error (ошибка) в Java представляет собой серьёзные проблемы, которые программа не должна пытаться обрабатывать. Такие ошибки, как правило, генерируются виртуальной машиной Java (JVM) и указывают на сбои, не зависящие от кода программы — например, утечки памяти или переполнение стека. Что такое Exception в Java? - Exception (исключение) — это ситуации, которые программа может предсказать и обработать. Это ошибки, от которых можно восстановиться во время выполнения с помощью механизмов обработки исключений, таких как конструкции try-catch. 📲 Мы в MAX 👉@BookJava
1 108
15
🔥24 июня в 20.00 мск. приглашаем на открытый урок: "Отказоустойчивый и высоко-доступный кластер RabbitMQ" На вебинаре разбер
🔥24 июня в 20.00 мск. приглашаем на открытый урок: "Отказоустойчивый и высоко-доступный кластер RabbitMQ" На вебинаре разберём практические подходы к созданию отказоустойчивой и высоко-доступной очереди сообщений для высоконагруженных систем. 📌 Что будет: — Запуск и настройка кластера: Quorum Queues и Mirrored Queues (синхронная репликация) — Синхронизация очередей и обеспечение согласованности — Dead Letter Queue + правильные настройки durability — Гарантии доставки для Producer: баланс между надёжностью и производительностью — Asynchronous cluster-to-cluster message routing: Exchange Federation и Shovels 🎯 После вебинара вы сможете: — Самостоятельно развернуть отказоустойчивый кластер RabbitMQ — Настраивать Quorum Queues и Mirrored Queues под разные сценарии — Правильно работать с Dead Letter Queues и гарантиями доставки — Организовывать межкластерное взаимодействие сообщений — Проектировать надёжные асинхронные коммуникации в микросервисной архитектуре 👉 Регистрация открыта: https://vk.cc/cYZuQo Вебинар приурочен к старту курса «Высоконагруженные системы: архитектура и масштабирование». 🎁При покупке курса вы получите в подарок мини-курс по Kafka, который поможет подготовиться к собеседованию в бигтех Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1 012
16
🧩 Nullable поля в Entity: угроза вашему приложению Привет, друзья! Сегодня хочу поделиться одной ошибкой, которую часто встречаю в проектах — использование nullable = true в JPA-сущностях по умолчанию, без осознанного выбора. Когда мы пишем: @Column(name = "middle_name") private String middleName; JPA считает, что поле nullable, даже если по бизнес-логике оно быть пустым не должно. А вот что будет, если вы забыли это уточнить: 1. На уровне БД поле будет NULLABLE. 2. Hibernate не подскажет, что вы забыли заполнить поле. 3. В будущем это приведёт к NPE, особенно при маппинге DTO → Entity. 4. При миграциях Flyway/ Liquibase — возможно несоответствие схемы и модели. 🔍 Что делать? 1. Явно указывать nullable = false, если поле обязано быть заполнено: @Column(name = "email", nullable = false) private String email; 2. Использовать Bean Validation (@NotNull) — и не забывать включить её в контроллерах, сервисах, Hibernate. 3. Проверяйте соответствие схемы и сущностей. Можно использовать плагин Hibernate5DDL или включать валидацию схемы при старте. 📌 Простой совет: по умолчанию всё @Column(nullable = false), пока не докажете обратное. Берегите свои сущности 😉 📲 Мы в MAX 👉@BookJava
1 014
17
🧹 Как не захламлять логи в Java Сегодня покажу вам простой, но важный приём: логируйте по уровню, а не по привычке. Многие делают так: log.info("User found: " + user); Кажется безобидным? А теперь представьте, что в user лежит целый граф сущностей с ленивыми загрузками, или список из тысячи записей. Вы просто убьёте читаемость логов и производительность. Вот что делать вместо: if (log.isDebugEnabled()) { log.debug("User found: {}", user); } А ещё лучше — логируйте только то, что действительно нужно: log.debug("User found: id={}, email={}", user.getId(), user.getEmail()); Так вы: - Уменьшите размер логов - Сохраните ценную информацию - Упростите разбор инцидентов в проде 📌 Советы: - INFO — для бизнес-событий (например, “заказ оформлен”) - DEBUG — для отладки - WARN и ERROR — для проблем, которые требуют внимания А ты проверял свои логи в проде? Не пора ли провести ревизию? 📲 Мы в MAX 👉@BookJava
895
18
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
748
19
🧪 Зачем Java-разработчику тестировать логику в SQL? Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение. Если у тебя в проекте сложная логика в JOIN, CASE, оконных функциях или CTE — протестируй это на стороне базы, как обычную функцию. 🔹 Создаём функцию в PostgreSQL: CREATE OR REPLACE FUNCTION test_discount(user_id INT) RETURNS NUMERIC AS $$ BEGIN RETURN ( SELECT CASE WHEN u.vip = true THEN 0.2 ELSE 0.05 END FROM users u WHERE u.id = user_id ); END; $$ LANGUAGE plpgsql; 🔹 Проверяем прямо в базе: SELECT test_discount(101); -- вернёт 0.2 или 0.05 ✅ Это удобно, когда: - Ты хочешь протестировать ветки логики без запуска всего приложения; - У тебя CI/CD запускает SQL-тесты отдельно (через pgTAP, например); - Ты хочешь быстро показать запрос аналитику или тимлиду без Java-контекста. 💡 Лайфхак: если ты используешь Liquibase/Flyway — можно держать такие функции прямо в changelog'ах как test-only objects, не влияя на runtime-приложение. Попробуй — экономит массу времени на ревью и отладке запросов! 📲 Мы в MAX 👉@BookJava
1 039
20
🔐 Bouncy Castle: Легендарная криптография для Java Если вы разрабатываете на Java и вам нужно работать с шифрованием на серь
🔐 Bouncy Castle: Легендарная криптография для Java Если вы разрабатываете на Java и вам нужно работать с шифрованием на серьезном уровне, этот репозиторий - абсолютный мастхэв. Официальный репозиторий проекта Bouncy Castle (bc-java) - это настоящий швейцарский нож для любых криптографических задач. Стандартной реализации JCA/JCE (Java Cryptography Architecture / Extension) часто не хватает для сложных или специфических сценариев. Bouncy Castle блестяще решает эту проблему, предлагая как низкоуровневый (lightweight) криптографический API, так и полнофункциональный провайдер для JCE. 🛠 Главные возможности библиотеки: • Огромный выбор алгоритмов: От классических RSA, AES и ECC до различных национальных стандартов (включая ГОСТы) и экзотических шифров. • Постквантовая криптография (PQC): Библиотека идет в ногу со временем и активно внедряет постквантовые алгоритмы, устойчивые к будущим атакам с использованием квантовых компьютеров. • Инфраструктура открытых ключей (PKI): Мощнейшие и очень удобные API для генерации и обработки X.509 сертификатов, CRL, а также работа со стандартами CMS, S/MIME, OpenPGP, TSP, CMP, CRMF и OCSP. • Поддержка TLS/DTLS: Собственный независимый API для работы с защищенными сетевыми протоколами (вплоть до TLS 1.3). • Независимость от версии Java: Bouncy Castle поддерживает широкий спектр версий JVM, начиная с весьма старых (J2SE 1.5+) и заканчивая самыми современными. 💡 Когда это нужно? Bouncy Castle выручает там, где пасуют стандартные средства JDK. Нужно сгенерировать сложный сертификат «на лету», распарсить зашифрованное PGP-сообщение, использовать нестандартную эллиптическую кривую или реализовать защищенный протокол без привязки к конкретной ОС? Для всего этого используется Bouncy Castle. https://github.com/bcgit/bc-java 📲 Мы в MAX 👉@BookJava
1 060