10986
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
Совет SpringBoot
Вы можете запустить метод в Spring @Service сразу после запуска приложения, аннотируя его с помощью@EventListener (ApplicationReadyEvent.class). Метод не может иметь параметров. Иногда я неправильно использую его, чтобы быстро протестировать определенный метод Spring Service.
📲 Мы в MAX
👉@BookJava
⚡️ Микро-оптимизация: Прощай, AtomicInteger, привет, VarHandle!
👋 Сегодня поговорим о том, как можно немного ускорить ваш код, работающий с атомарными операциями, и сделать его более "современным" с помощью VarHandle, который появился в Java 9.
🧐 Проблема с AtomicIntegerAtomicInteger - это классический способ обеспечить атомарные операции (например, инкремент) над целым числом без блокировок, используя механизм Compare-And-Swap (CAS).
Однако, у него есть небольшой недостаток: он добавляет слой косвенности. Методы типа getAndIncrement() в AtomicInteger обычно вызывают внутренние статические методы из класса sun.misc.Unsafe (или его аналогов в более новых версиях), передавая в них ссылку на объект, смещение поля и новое значение.
// Примерно так это выглядит внутри AtomicInteger
// В реальном коде это, конечно, оптимизировано, но суть та же.
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
VarHandle!VarHandle - это новый, более гибкий и, что самое главное, более производительный низкоуровневый API для работы с полями переменных (как экземпляров, так и статических) с заданными барьерами памяти и атомарностью.VarHandle, чем через старые обертки типа AtomicInteger или прямые вызовы Unsafe.VarHandle вместо AtomicIntegerAtomicInteger, мы просто объявляем поле volatile в нашем классе и получаем VarHandle для этого поля.
public class Counter {
private volatile int count = 0; // Поле должно быть volatile
// ...
}
VarHandle:VarHandle нужно инициализировать один раз (обычно в статическом блоке) для доступа к полю.
private static final VarHandle COUNT_HANDLE;
static {
try {
// Получаем VarHandle для поля 'count' класса 'Counter' с типом int
COUNT_HANDLE = MethodHandles.lookup().findVarHandle(
Counter.class,
"count",
int.class
);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new Error(e);
}
}
getAndAdd VarHandle работает точно так же, как getAndAdd в AtomicInteger.
public int increment() {
// В отличие от AtomicInteger, где первый аргумент неявен,
// VarHandle требует первым аргументом *объект*,
// к полю которого мы обращаемся.
return (int) COUNT_HANDLE.getAndAdd(this, 1);
}
getAndAdd() через VarHandle могут быть незначительно быстрее (зачастую на 5-10%), чем те же операции через AtomicInteger, особенно под высокой нагрузкой, благодаря более эффективной генерации кода JIT-компилятором.🛑 Важно: Это микро-оптимизация. В большинстве приложений вы не заметите разницы. Но если вы пишете критически важные фреймворки, высоконагруженные коллекции или библиотеки, где каждая наносекунда на счету, переход на VarHandle может быть оправдан.VarHandle - это не только способ микро-оптимизации, но и стандартный, гибкий API для атомарного доступа, который заменил устаревший и менее безопасный Unsafe. Для нового кода, где требуется низкоуровневый атомарный доступ, стоит отдавать предпочтение именно ему.
Что такое «ссылка на метод»?
Если существующий в классе метод уже делает все, что необходимо, то можно воспользоваться механизмом method reference (ссылка на метод) для непосредственной передачи этого метода. Такая ссылка передается в виде:
⚫️имя_класса::имя_статического_метода для статического метода;
⚫️объект_класса::имя_метода для метода экземпляра;
⚫️название_класса::new для конструктора.
Результат будет в точности таким же, как в случае определения лямбда-выражения, которое вызывает этот метод.
private interface Measurable {
public int length(String string);
}
public static void main(String[] args) {
Measurable a = String::length;
System.out.println(a.length("abc"));
}
👩💻 Ваши Java-приложения под нагрузкой едва дышат? Профилирование и оптимизация кода остаются за скобками?
🎯 Курс «Java Developer. Advanced» от OTUS — это глубокое погружение в устройство JVM, байткод, сборщики мусора, профилирование и оптимизацию в облаке.
Наши эксперты-практики покажут, как выбрать GC, снять дамп памяти и обнаружить утечки, как профилировать “горячие” места, настраивать интеграцию с Prometheus & Grafana и деплоить сервисы в Kubernetes.
✔️ Вы научитесь обосновывать выбор JVM-имплементации, анализировать heap-дампы, синхронизировать потоки, использовать Reactor и неблокирующие I/O, проектировать метрики и трассировку.
➡️ Пройдите короткий тест и присоединяйтесь к группе: https://vk.cc/cRBJWK
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Микросервисы на основе событий с Kafka Streams и Spring Boot
Всем привет! Это моя первая статья на Habr, так что не судите строго за стиль, а вот по содержанию буду рад любой конструктивной критике.
Статья основана на публикациях Confluent о том, как можно реализовать микросервисную архитектуру на основе событий с помощью Kafka Streams и KSQL.
https://habr.com/ru/articles/775900/
📲 Мы в MAX
👉@BookJava
Совет 💡
Добавьте в JDBC URL свойство ApplicationName (зависит от БД, не в каждой БД оно есть!). Таким образом, в списке сессий вместо имени JDBC-драйвера будет отображаться имя набора. Это поможет при поиске неисправностей, когда несколько приложений подключаются к одной и той же БД.
📲 Мы в MAX
👉@BookJava
🏗 Курс “Software Architect” от OTUS — набор заканчивается! 🚨
Успейте занять место в группе курса «Software Architect»! Станьте экспертом в проектировании отказоустойчивых и масштабируемых систем. Пройдите вступительный тест и получите скидку, чтобы не пропустить старт обучения!
✅ Почему стоит пойти:
- 100% практики на реальных проектах
- Проектирование гибких архитектур
- Микросервисы, интеграции, Big Data
- Современные паттерны: CQRS, Event Sourcing
- Карьерный рост: рекомендации партнёрам для лучших
✅ Кому подойдёт:
- Разработчики, готовые к новому уровню
- Архитекторы, углубляющие экспертизу
- Тимлиды
✅ Что освоите:
- Проектирование масштабируемых архитектур
- Оптимизация взаимодействия сервисов
- Повышение качества и устойчивости систем
📌 Пройдите тест и забронируйте место со скидкой. Не упустите шанс стать экспертом в архитектуре систем! Подробности уточняйте у менеджера
👉 Пройти тестирование https://vk.cc/cRpnlp
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Совет по Spring Boot 💡
Вы думаете о замене 🍃RestTemplate на новый Spring RestClient? Конфигурация SSL очень проста благодаря поддержке 🔐SslBundles через интерфейс RestClientSsl
📲 Мы в MAX
👉@BookJava
Что выведет код?
public class Main {
public static final int END = Integer.MAX_VALUE;
public static final int START = END - 100;
public static void main(String[] args) {
int count = 0;
for (int i = START; i <= END; i++) count++;
System.out.println(count);
}
}
Работа с JDK Flight Recorder (JFR) из командной строки: инструмент для профилирования без графического интерфейса
Экосистема Java богата качественными инструментами для разработчиков, и средства профилирования и диагностики - не исключение.
Существуют коммерческие профилировщики, есть встроенные инструменты профилирования в ведущих IDE. А если вам важна свобода (или цена является важным фактором), open source сообщество также готово предложить достойные альтернативы.
JFR (JDK Flight Recorder) один из ключевых инструментов для диагностики работы Java приложений, который можно эффективно использовать из командной строки. Приёмам работы с этим инструментом я хочу посвятить данную статью.
https://habr.com/ru/companies/axiomjdk/articles/964362/
📲 Мы в MAX
👉@BookJava
Совет 💡
Обычно при сортировке в Spring Data мы указываем свойство, по которому хотим отсортировать, как строку. Однако существует класс TypedSort, который дает нам возможность передавать функцию в качестве параметра для сортировки. Это повышает безопасность типов в нашем коде.
📲 Мы в MAX
👉@BookJava
💡Совет по Java: Если в Java Map нужно хранить несколько значений для одного ключа, используйте Apache Commons MultiValuedMap.
Если нужно хранить несколько значений для одного ключа в Map, можно использовать MultiValuedMap:
- List для дублирующихся значений (с повторениями).
- Set для уникальных значений (без дубликатов).
Пример кода:
1. ArrayListValuedHashMap – значения хранятся в списке (допускаются дубликаты):
MultiValuedMap<Integer, String> listMap = new ArrayListValuedHashMap<>();
listMap.put(1, "A");
listMap.put(1, "A");
listMap.put(1, "B");
listMap.put(1, "C");
Collection<String> values = listMap.get(1);
// values = ["A", "A", "B", "C"]
MultiValuedMap<Integer, String> listMap = new HashSetValuedHashMap<>();
listMap.put(1, "A");
listMap.put(1, "A");
listMap.put(1, "B");
listMap.put(1, "C");
Collection<String> values = listMap.get(1);
// values = ["A", "B", "C"]
🎥 Открытый урок «Наблюдаемость микросервиса: метрики + Prometheus/Grafana».
🗓 11 ноября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Advanced».
Что будет на вебинаре:
✔️ Полезные метрики для микросервисов: технические и продуктовые; типовые анти-метрики.
✔️Интеграция Spring Actuator/Micrometer и экспорт /actuator/prometheus.
✔️ Сбор в Prometheus: таргеты, ретенция, базовые правила алертинга.
✔️ Дашборды «для разработчика» в Grafana: структура панелей, аннотации, drill-down.
В результате вебинара вы:
- Сможете выделять действительно важные метрики, подключить Actuator/Micrometer, настроить сбор в Prometheus и собрать базовый дашборд в Grafana.
Кому будет интересно:
Java backend-разработчикам, DevOps/SRE и инженерам, отвечающим за эксплуатацию микросервисов.
🔗 Ссылка на регистрацию: https://vk.cc/cR1RCp
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🚀 Совет по Spring 🚀
Тестовые библиотеки Spring Boot (Testjars) 🔥
Привет, поклонники Spring! В этом выпуске мы рассмотрим новый проект Spring Boot Testjars, который значительно упрощает создание и повторное использование вспомогательных сервисов на базе Java, таких как микросервисы на основе Spring Boot или инфраструктурные компоненты, например, Spring Authorization Server.
источник
📲 Мы в MAX
👉@BookJava
Java. Быстрая сортировка. Реализация алгоритма QuickSort.
Как работает быстрая сортировка, разбор и реализация алгоритма.
источник
📲 Мы в MAX
👉@BookJava
Совет
По умолчанию при обновлении сущности Hibernate обновляет все ее поля. Вы можете использовать аннотацию @DynamicUpdate на объекте @Entity и Hibernate будет обновлять только те столбцы, которые изменились.
📲 Мы в MAX
👉@BookJava
Использование Optional для избежания NullPointerException:
Optional — это контейнер, который может содержать или не содержать ненулевое значение.
Optional<String> optional = Optional.ofNullable(getValue());
optional.ifPresentOrElse(
value -> System.out.println("Value is present: " + value),
() -> System.out.println("Value is absent")
);
Совет по Java 💡
Использование try-with-resources для автоматического управления ресурсами
Оператор try-with-resources гарантирует, что каждый ресурс будет закрыт в конце оператора.
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Многопоточность
Как можно создать потоки в Java?
Как устроить Deadlock, а затем уйти от взаимной блокировки навсегда
Два самых полезных слова в многопоточности join() и Future
источник
📲 Мы в MAX
👉@BookJava
Неожиданное введение в Spring MVC
Spring MVC кажется сложным — пока не поймёшь, как он вырос из обычных сервлетов. На вебинаре шаг за шагом соберём свой первый фреймворк и разберёмся, зачем нужен MVC.
Приглашаем на открытый урок.
📅 Встречаемся 24 ноября в 20:00 мск.
Расскажет Александр Оруджев — Senior Software Engineer. Встречаемся на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом разберете:
• как сервлеты превратились в контроллеры;
• что делает Spring под капотом;
• как построить собственный мини-MVC и понять принципы работы фреймворка.
После вебинара вы:
— поймёте архитектуру MVC без заучивания;
— перестанете бояться Spring MVC и начнёте использовать его осознанно;
— сделаете первый шаг к системному пониманию backend-разработки.
24 ноября в 20:00 открытый урок проходит в преддверие старта курса «Разработчик на Spring Framework». Все участники получат скидку на обучение.
👉 Регистрация бесплатная, но количество мест ограничено — успей занять своё место: https://vk.cc/cRv9kP
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Совет 🚀 Spring Retry 🚀
Spring Retry предлагает возможность автоматического повторного выполнения неудачной операции. 🔥
https://github.com/spring-projects/spring-retry
📲 Мы в MAX
👉@BookJava
Опишите поведение аннотации @Autowired
1. Контейнер определяет тип объекта для внедрения
2. Контейнер ищет бины в контексте(он же контейнер), которые соответствуют нужному типу
3. Если есть несколько кандидатов, и один из них помечен как @Primary, то внедряется он
4. Если используется аннотации @Autowire + Qualifier, то контейнер будет использовать информацию из @Qualifier, чтобы понять, какой компонент внедрять
5. В противном случае контейнер попытается внедрить компонент, основываясь на его имени или ID
6. Если ни один из способов не сработал, то будет выброшено исключение
Контейнер обрабатывает DI с помощью AutowiredAnnotationBeanPostProcessor. В связи с этим, аннотация не может быть использована ни в одном BeanFactoryPP или BeanPP.
Если внедряемый объект массив, коллекция, или map с дженериком, то Spring внедрит все бины подходящие по типу в этот массив(или другую структуру данных). В случае с map ключом будет имя бина.
//параметр указывает, требуется ли DI@Authowired(required = true/false)
📲 Мы в MAX
👉@BookJava
🎥 Открытый урок «Java Memory Model: как синхронизировать потоки».
🗓 20 ноября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Advanced».
JMM определяет, как JVM видит память: что наблюдают потоки и где нужна синхронизация — база корректного многопоточного кода.
Создаём CRUD REST API в Spring Boot быстро и просто вместе с Amplicode
Статья демонстрирует, как с помощью инструмента Amplicode эффективно создавать REST-контроллеры в приложениях на Spring Boot. Автор показывает процесс генерации CRUD-методов (создание, чтение, обновление, удаление) и делегирования существующих методов в контроллер, что упрощает разработку API. Приводятся практические примеры и рекомендации по использованию Amplicode для ускорения разработки и повышения качества кода.
https://habr.com/ru/companies/haulmont/articles/866060/
📲 Мы в MAX
👉@BookJava
⌨️ DSL в Kotlin: от теории к практике
Приглашаем на открытый урок.
🗓 20 ноября в 19:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».
Программа вебинара:
✔️ Что такое DSL и зачем он нужен в современной разработке
✔️ Основные элементы Kotlin для создания DSL: лямбды, infix-функции, расширения
✔️ Практические примеры использования DSL в Gradle, Ktor и TeamCity
Вебинар будет полезен:
Бэкенд-разработчикам на Kotlin, тимлидам и всем, кто хочет писать более чистый и поддерживаемый код.
В результате вебинара:
Научитесь создавать собственные DSL и применять их при разработке
🔗 Ссылка на регистрацию: https://vk.cc/cR97Xt
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🚀 Подборка Telegram каналов для программистов
Системное администрирование, DevOps 📌
/channel/bash_srv Bash Советы
/channel/win_sysadmin Системный Администратор Windows
/channel/sysadmin_girl Девочка Сисадмин
/channel/srv_admin_linux Админские угодья
/channel/linux_srv Типичный Сисадмин
/channel/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
/channel/linux_odmin Linux: Системный администратор
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
/channel/DevLab1C 1С:Предприятие 8
/channel/razrab_1C 1C Разработчик
/channel/buh1C_prog 1C Программист | Бухгалтерия и Учёт
/channel/rabota1C_rus Вакансии для программистов 1С
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия.
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
/channel/androidspb Разработка под Android: Kotlin, Java.
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Big Data, Machine Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
/channel/lifeproger Жизнь программиста. Авторский канал.
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
/channel/matgeoru Математика | Геометрия | Логика
Excel лайфхак📌
/channel/Excel_lifehack
/channel/mir_teh Мир технологий (Technology World)
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
OpenAPI + Spring: ускоряем разработку и повышаем качество API
Разработка REST API — рутинная? Только если без OpenAPI. Узнайте, как избавиться от ручной синхронизации между фронтом, бэком и тестами.
На вебинаре разберём:
• зачем нужна OpenAPI-спецификация и как с ней жить удобно;
• генерацию кода и документации;
• интеграцию OpenAPI в Spring-приложение;
• советы по масштабируемости и поддержке API.
После вебинара вы сможете:
— быстро внедрить OpenAPI в свой проект;
— сократить ошибки на стыке команд;
— улучшить поддержку и документирование микросервисов.
12 ноября в 20:00 открытый урок проходит в преддверие старта курса «Разработчик на Spring Framework». Все участники получат скидку на обучение.
👉 Регистрация бесплатная, но количество мест ограничено — успей занять своё место:
https://vk.cc/cR5B3p
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Шпаргалка по Java
📲 Мы в MAX
👉@BookJava
5 ноября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Илья Аров, старший разработчик в МТС, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Илье
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
📌 Java Collections
📲 Мы в MAX
👉@BookJava