Библиотека Java разработчика
前往频道在 Telegram
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
显示更多📈 Telegram 频道 Библиотека Java разработчика 的分析概览
频道 Библиотека Java разработчика (@bookjava) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 10 222 名订阅者,在 技术与应用 类别中位列第 11 888,并在 俄罗斯 地区排名第 63 392 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 10 222 名订阅者。
根据 13 七月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -45,过去 24 小时变化为 -4,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 9.43%。内容发布后 24 小时内通常能获得 4.52% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 964 次浏览,首日通常累积 462 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 7。
- 主题关注点: 内容集中在 string, интерфейс, строка, boot, api 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.
По всем вопросам @evgenycarter
РКН clck.ru/3KoGeP”
凭借高频更新(最新数据采集于 14 七月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
10 222
订阅者
-424 小时
-117 天
-4530 天
数据加载中...
相似频道
标签云
进出提及
---
---
---
---
---
---
吸引订阅者
七月 '26
七月 '26
+13
在0个频道中
六月 '26
+46
在0个频道中
Get PRO
五月 '26
+64
在0个频道中
Get PRO
四月 '26
+27
在0个频道中
Get PRO
三月 '26
+28
在0个频道中
Get PRO
二月 '26
+39
在0个频道中
Get PRO
一月 '26
+43
在1个频道中
Get PRO
十二月 '25
+16
在0个频道中
Get PRO
十一月 '25
+72
在31个频道中
Get PRO
十月 '25
+47
在1个频道中
Get PRO
九月 '25
+61
在36个频道中
Get PRO
八月 '25
+55
在0个频道中
Get PRO
七月 '25
+63
在27个频道中
Get PRO
六月 '25
+44
在19个频道中
Get PRO
五月 '25
+65
在44个频道中
Get PRO
四月 '25
+90
在38个频道中
Get PRO
三月 '25
+78
在38个频道中
Get PRO
二月 '25
+100
在31个频道中
Get PRO
一月 '25
+83
在33个频道中
Get PRO
十二月 '24
+116
在34个频道中
Get PRO
十一月 '24
+67
在32个频道中
Get PRO
十月 '24
+99
在29个频道中
Get PRO
九月 '24
+131
在28个频道中
Get PRO
八月 '24
+97
在18个频道中
Get PRO
七月 '24
+45
在0个频道中
Get PRO
六月 '24
+99
在23个频道中
Get PRO
五月 '24
+234
在18个频道中
Get PRO
四月 '24
+210
在0个频道中
Get PRO
三月 '24
+282
在21个频道中
Get PRO
二月 '24
+274
在17个频道中
Get PRO
一月 '24
+329
在23个频道中
Get PRO
十二月 '23
+222
在23个频道中
Get PRO
十一月 '23
+117
在16个频道中
Get PRO
十月 '23
+136
在18个频道中
Get PRO
九月 '23
+243
在0个频道中
Get PRO
八月 '23
+325
在0个频道中
Get PRO
七月 '23
+322
在0个频道中
Get PRO
六月 '23
+306
在0个频道中
Get PRO
五月 '23
+287
在0个频道中
Get PRO
四月 '23
+271
在0个频道中
Get PRO
三月 '23
+603
在0个频道中
Get PRO
二月 '23
+153
在0个频道中
Get PRO
一月 '23
+214
在0个频道中
Get PRO
十二月 '22
+206
在0个频道中
Get PRO
十一月 '22
+140
在0个频道中
Get PRO
十月 '22
+207
在0个频道中
Get PRO
九月 '22
+226
在0个频道中
Get PRO
八月 '22
+288
在0个频道中
Get PRO
七月 '22
+299
在0个频道中
Get PRO
六月 '22
+278
在0个频道中
Get PRO
五月 '22
+315
在0个频道中
Get PRO
四月 '22
+318
在0个频道中
Get PRO
三月 '22
+417
在0个频道中
Get PRO
二月 '22
+328
在0个频道中
Get PRO
一月 '22
+245
在0个频道中
Get PRO
十二月 '21
+222
在0个频道中
Get PRO
十一月 '21
+172
在0个频道中
Get PRO
十月 '21
+323
在0个频道中
Get PRO
九月 '21
+207
在0个频道中
Get PRO
八月 '21
+331
在0个频道中
Get PRO
七月 '21
+310
在0个频道中
Get PRO
六月 '21
+271
在0个频道中
Get PRO
五月 '21
+297
在0个频道中
Get PRO
四月 '21
+328
在0个频道中
Get PRO
三月 '21
+419
在0个频道中
Get PRO
二月 '21
+436
在0个频道中
Get PRO
一月 '21
+452
在0个频道中
Get PRO
十二月 '20
+7 112
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 14 七月 | +2 | |||
| 13 七月 | 0 | |||
| 12 七月 | +1 | |||
| 11 七月 | +2 | |||
| 10 七月 | 0 | |||
| 09 七月 | +1 | |||
| 08 七月 | +1 | |||
| 07 七月 | +2 | |||
| 06 七月 | 0 | |||
| 05 七月 | 0 | |||
| 04 七月 | +1 | |||
| 03 七月 | 0 | |||
| 02 七月 | +2 | |||
| 01 七月 | +1 |
频道帖子
💡 Ленивая инициализация бинов в 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 МСК
🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework».
На занятии мы разберем:
✔️Преимущества нативного SQL при разработке DAO.
✔️ Основные возможности Spring JDBC для работы с запросами.
✔️ Подходы к обеспечению безопасности и тестируемости DAO.
Кому будет интересно:
Урок будет полезен Java-разработчикам, архитекторам ПО и специалистам по базам данных, стремящимся оптимизировать доступ к данным.
🔗 Ссылка на регистрацию: https://vk.cc/cZxief
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576 | 533 |
| 3 | 🧠 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 и без магии.
📌 Используем флаг:
-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-разработчик».
Программа урока:
✔️ Развенчиваем главный миф новичка: правда ли, что «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: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 представляет собой серьёзные проблемы, которые программа не должна пытаться обрабатывать. Такие ошибки, как правило, генерируются виртуальной машиной Java (JVM) и указывают на сбои, не зависящие от кода программы — например, утечки памяти или переполнение стека.
Что такое Exception в Java?
- Exception (исключение) — это ситуации, которые программа может предсказать и обработать. Это ошибки, от которых можно восстановиться во время выполнения с помощью механизмов обработки исключений, таких как конструкции try-catch.
📲 Мы в MAX
👉@BookJava | 1 108 |
| 15 | 🔥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 (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 |
