Последние посты

Библиотека Java разработчика
21 сент., 06:17
📌 picocli — это современная библиотека для создания CLI-приложений на Java. Она упрощает разработку командных интерфейсов, обеспечивая:Автоматическую генерацию --help и --version Поддержку подкоманд (как в git commit, git push) Аргументы, параметры, опции с короткими и длинными флагами (-v, --verbose) Интеграцию с GraalVM (подходит для нативной компиляции) Поддержку аннотаций (аннотируй POJO — и готово!) Автоматическую валидацию аргументов Цветной вывод и гибкое форматирование Интерактивный режим и автодополнениеПроект активно развивается, полностью документирован и используется в сотнях продакшн-проектов. Если ты ищешь мощную и простую в использовании CLI-библиотеку на Java — picocli отличный выбор.https://github.com/remkop/picocli📲 Мы в MAX👉@BookJava


Библиотека Java разработчика
18 сент., 05:23
Double-brace инициализация в Java — это идиома, которая используется для инициализации коллекций (и иногда других объектов) в краткой форме. Она выглядит как две открывающие фигурные скобки подряд {{ и имеет специфическое поведение. Пример:import java.util.;List<String> list = new ArrayList<String>() {{ add("one"); add("two"); add("three"); }};Как это работает:Double-brace инициализация — это комбинация двух конструкций:1. Анонимный внутренний класс:new ArrayList<String>() { ... }Создаётся новый безымянный подкласс ArrayList.


Библиотека Java разработчика
16 сент., 06:15
🧠@Value vs @ConfigurationProperties — не выбирай наобумОба способа хороши для конфигурации, но используют их по-разному. И если ты всё ещё везде пихаешь @Value, держи краткий гайд, когда лучше что:📌 @Value — просто, но не гибко:@Value("${my.prop}") private String value;✅ Хорошо для единичных значений ❌ Плохо для сложных структур, списков, валидации ❌ Трудно покрыть тестами (без TestPropertySource) ❌ Нет биндинга по префиксу → нет группировки📌 @ConfigurationProperties — сила и масштаб:@ConfigurationProperties(prefix = "app.feature") public class FeatureProperties { private boolean enabled; private List<String> items;


Библиотека Java разработчика
14 сент., 07:29
🧠 Трюк с @EventListener в Spring — убираем лишний @TransactionalEventListenerКогда тебе нужно обрабатывать события в рамках транзакции, мы часто пишем:@TransactionalEventListener public void handleEvent(MyEvent event) { // ... }⚠️ Но есть нюанс: @TransactionalEventListener по умолчанию срабатывает после коммита. Иногда это не очевидно и вызывает баги, особенно если ожидаешь, что событие обработается внутри транзакции.📌 Альтернатива: обычный @EventListener, но вместе с TransactionSynchronizationManager.💡 Сниппет:@Component public class MyEventHandler {@EventListener public void handle(MyEvent event) {


Библиотека Java разработчика
10 сент., 07:37
👩💻 HTTP-сервер на чистой Java за 30 минутПриглашаем на открытый урок.🗓 21 сентября в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Java разработчик. Продвинутый уровень».Разберем, как браузер общается с сервером, и создадим работающий HTTP-сервис без Spring и сторонних библиотек.О чем поговорим: ✔️ Как устроен HTTP-запрос ✔️ Создадим сервер на Java ✔️ Добавим несколько адресов ✔️ Откроем результат в браузере ✔️ Разберём, что скрывает Spring🔗 Ссылка на регистрацию: https://vk.cc/d1sLwnРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576


Библиотека Java разработчика
10 сент., 06:36
🧠 Как не словить LazyInitializationException в Spring Boot + HibernateОдна из самых частых ошибок при работе с JPA:org.hibernate.LazyInitializationException: failed to lazily initialize a collection📌 Причина: лениво загружаемая коллекция (LAZY) обращается к БД вне транзакции — например, в слое контроллера или после закрытия Session.💡 Как избежать?✅ Решение 1: @Transactional в сервисеУбедитесь, что вы обращаетесь к ленивым коллекциям внутри метода с @Transactional:@Transactional public UserDto getUser(Long id) { User user = userRepository.findById(id) .orElseThrow();// OK: коллекция friends будет инициализирована в транзакции


Библиотека Java разработчика
9 сент., 04:40
📌 Java Collections📲 Мы в MAX👉@BookJava




Библиотека Java разработчика
4 сент., 05:26
🧠 Spring Boot: ленивые зависимости через ObjectProviderИногда сервису не нужно всегда инжектить другую зависимость при старте — только иногда по ходу работы. Но @Autowired всё равно тянет её сразу, даже если она вам пока не нужна. Это бьёт по времени старта и может вызвать циклические зависимости.💡 Решение: использовать ObjectProvider<T>.Пример:@Service public class NotificationService {private final ObjectProvider<EmailSender> emailSenderProvider;public NotificationService(ObjectProvider<EmailSender> emailSenderProvider) { this.emailSenderProvider = emailSenderProvider; }public void sendEmailIfEnabled(String to, String body) { if (featureEnabled()) { EmailSender sender = emailSenderProvider.getIfAvailable();


Библиотека Java разработчика
3 сент., 06:06
💡 Чем опасен @Scheduled(fixedRate) без @Transactional?Расписание в Spring через @Scheduled — удобный способ запускать задачи по таймеру. Но часто разработчики забывают про транзакции, особенно с fixedRate, и попадают в ловушку.📌 Пример проблемы:@Scheduled(fixedRate = 10_000) public void cleanUp() { List<Job> jobs = jobRepository.findAllByStatus(PENDING); jobs.forEach(job -> { job.setStatus(PROCESSING); jobRepository.save(job); }); }🧨 Каждые 10 секунд метод запускается заново. Если выполнение предыдущего ещё не закончено, начнётся второй поток, который заберёт те же PENDING -записи. В итоге — дублирование обработки, гонки, повреждение данных.📉 Особенно критично при долгих задачах или высокой нагрузке.


Библиотека Java разработчика
1 сент., 08:16
🔴 Завтра тестовое собеседование с Java-разработчиком2 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.Как это будет: 📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос СергеюЭто бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_botРеклама. О рекламодателе.


Библиотека Java разработчика
1 сент., 06:19
🔧 Maven vs. Gradle: что выбрать разработчику?Когда речь заходит о сборке Java-проектов, выбор обычно падает на два главных инструмента: Maven и Gradle. Оба давно стали стандартом индустрии, но каждый имеет свои особенности. Разберёмся, что выбрать 👇☕ Maven — проверенная классика✅ Строгая структура: легче читать и сопровождать ✅ Надёжность и предсказуемость сборки ✅ Большое комьюнити и множество плагинов ⚠️ XML-конфигурация громоздкая ⚠️ Медленнее по сравнению с Gradle⚡ Gradle — гибкость и скорость✅ Поддержка Kotlin и Groovy DSL ✅ Инкрементальные сборки и кэширование → быстрее ✅ Более гибкий подход к настройке ⚠️ Порог входа выше ⚠️ Иногда сложно отлаживать конфигурацию


Библиотека Java разработчика
31 авг., 06:02
🧠 Трюк с @Configuration и @ComponentScan: как не словить баг при миграции на Spring Boot 3+Когда вы выносите конфигурацию в отдельный модуль или создаёте библиотеку с @Configuration-классами — не забывайте:📌 Spring Boot 3+ по умолчанию НЕ сканирует пакеты вне стартового (main).Пример:// Внутри библиотеки @Configuration public class MyLibConfig { @Bean public MyService myService() { return new MyService(); } }И вы такие:@SpringBootApplication


Библиотека Java разработчика
30 авг., 14:06
🧠 Неочевидный performance-трюк с @Transactional(readOnly = true)Многие используют @Transactional(readOnly = true) просто по инерции. Но вы знали, что в Spring это влияет не только на семантику, но и на производительность?📌 Что делает readOnly = true:Подсказывает Hibernate, что внутри транзакции не будет изменений сущностей. Это позволяет избежать затрат на грязную проверку (dirty checking). Не создаётся snapshot состояний сущностей → меньше памяти и операций.💡 Пример:@Transactional(readOnly = true) public List<User> findActiveUsers() { return userRepository.findByActiveTrue(); }⚠️ А теперь важно: если вы случайно измените сущность в таком методе, Hibernate проигнорирует изменения — потому что readOnly намекает: "не трогай".📉 В реальном приложении с большим количеством запросов к БД, особенно читающих, такой подход даёт ощутимый буст — меньше нагрузки на ORM, меньше GC,


Библиотека Java разработчика
26 авг., 15:13
🧠 Spring Boot: правильно логируем @ExceptionHandlerСейчас покажу простой, но часто упускаемый момент при обработке ошибок в Spring Boot.Если у вас есть глобальный @ExceptionHandler, убедитесь, что вы не теряете stacktrace при логировании.❌ Плохо:@ExceptionHandler(MyException.class) public ResponseEntity<String> handle(MyException ex) { log.error("MyException occurred: {}", ex.getMessage()); // stacktrace теряется! return ResponseEntity.status(500).body("Error"); }✅ Хорошо:@ExceptionHandler(MyException.class) public ResponseEntity<String> handle(MyException ex) { log.error("MyException occurred", ex); // stacktrace будет видно в логе return ResponseEntity.status(500).body("Error");


Библиотека Java разработчика
24 авг., 06:49
🧠 Spring Boot: как НЕ попасть в ловушку с @Scheduled и многопоточностьюКогда используете @Scheduled для периодических задач в Spring Boot, важно понимать: по умолчанию все задачи выполняются в одном потоке.@Scheduled(fixedRate = 5000) public void syncData() { // долгая операция }📌 Если таких задач несколько или они работают долго — остальные ждут. Это создаёт бутылочное горлышко и приводит к неожиданным задержкам.💡 Решение: настроить кастомный executor:@Configuration @EnableScheduling public class SchedulerConfig implements SchedulingConfigurer {@Override public void configureTasks(ScheduledTaskRegistrar registrar) { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();


Библиотека Java разработчика
23 авг., 11:06
🚀 Подборка полезных 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 Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса)Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхакMAXСистемный Администратор | Sysadmin Windows & Linux Server. …Купить рекламу: https://telega.in/m/i_odmin Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Раб…
Библиотека Java разработчика
20 авг., 06:17
💡 Не делай этого в @PostConstruct — особенно в продеСейчас расскажу, почему инициализировать важную бизнес-логику в @PostConstruct — плохая идея.Типичный пример:@Component public class CacheLoader {private final SomeService service;public CacheLoader(SomeService service) { this.service = service; }@PostConstruct public void init() { service.loadDataIntoCache(); // ⚠️ обращение к БД } }


Библиотека Java разработчика
18 авг., 16:02
🧠 JVM-разработчики, стягиваемся в Москву 29 августаВ последнюю субботу лета бэкенд- и JVM-комьюнити соберется на JVM Day, который устраивает Т-Банк. Ждут всех разработчиков, архитекторов и тимлидов, которые работают с Java, Kotlin и Scala.В программе: – Андрей Кулешов расскажет о том, что изменилось в мире JVM за год. – Сергей Петрелевич разберет Mechanical Sympathy. – Александр Ланцов покажет, какие модели конкурентности актуальны после появления Loom. – Антон Курако объяснит, почему красивые показатели бенчмарков могут вводить в заблуждение.А после докладов во дворе штаб-квартиры Т-Банка пройдут: – Игры на Sega и ИТ-Квиз. – PowerPoint Party и открытый микрофон с историями ошибок. – Диджей-сет на виниле под открытым небом.Места ограничены, регистрироваться тут. Пишите в комментариях, если идете на конфу.📲 Мы в MAX👉@BookJava


Библиотека Java разработчика
18 авг., 15:15
🧠 @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:
Библиотека Java разработчика
18 авг., 11:07
👩💻 Работа с Kafka через библиотеку Kafka ClientsПриглашаем на открытый урок.🗓 26 августа в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Java разработчик. Продвинутый уровень».Kafka Clients это нижний уровень для работы с Kafka из Java. Все более высокоуровневые библиотеки основаны на нем. Данный открытый урок проходит в рамках курса Java разработчик. Продвинутый уровень.О чем поговорим: ✔️ Чтение и отправка сообщений в Kafka ✔️ Управление топиками ✔️ Разные форматы: текст, JSON, Avro ✔️ Использование транзакций🔗 Ссылка на регистрацию: https://vk.cc/d0zMZ5Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

