Библиотека Java разработчика
📚 Лайфхаки, приёмы и лучшие практики для 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) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
Загрузка данных...
| Дата | Привлечение подписчиков | Упоминания | Каналы | |
| 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:
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 |
