🛠️ Разбираем `Optional` в Java: когда стоит использовать?
Сегодня поговорим о
🔹 Когда использовать
✅ Возвращаемые значения из методов
Если метод может вернуть
_Пример:_
✅ Когда работаешь с потоками (`Stream API`)
Комбинируя
_Пример:_
✅ Когда данные необязательны, но нужны обработчики
Например, можно использовать
_Пример:_
🔻 Когда
❌ В полях сущностей (DTO, Entity, POJO)
Хранение
❌ В параметрах методов
Не стоит передавать
_❌ Так делать не нужно:_
_✅ Лучше:_
Вывод 📌
✅
А как вы используете
👉 @java_geek
Сегодня поговорим о
Optional
в Java — инструменте, который помогает избежать NullPointerException
и делает код более читаемым. Однако не все так однозначно, и у Optional
есть свои нюансы.🔹 Когда использовать
Optional
?✅ Возвращаемые значения из методов
Если метод может вернуть
null
, лучше вернуть Optional<T>
, чтобы явно показать это. _Пример:_
public Optional<String> findUsernameById(int id) {
return id == 1 ? Optional.of("user123") : Optional.empty();
}
✅ Когда работаешь с потоками (`Stream API`)
Комбинируя
Optional
и Stream
, можно элегантно обработать потенциально пустые значения. _Пример:_
Optional<String> username = users.stream()
.filter(user -> user.getId() == 1)
.map(User::getUsername)
.findFirst();
✅ Когда данные необязательны, но нужны обработчики
Например, можно использовать
ifPresent()
для выполнения действий, если значение существует. _Пример:_
optionalUser.ifPresent(user -> System.out.println("Привет, " + user.getUsername()));
🔻 Когда
Optional
не стоит использовать?❌ В полях сущностей (DTO, Entity, POJO)
Хранение
Optional
в полях объектов избыточно и неэффективно. Лучше использовать обычные null
или значение по умолчанию.❌ В параметрах методов
Не стоит передавать
Optional
в параметры методов. Это не дает преимуществ и только усложняет код. _❌ Так делать не нужно:_
public void process(Optional<User> user) { ... }
_✅ Лучше:_
public void process(User user) { ... }
Вывод 📌
✅
Optional
— это мощный инструмент, но применять его нужно разумно. Используем его там, где он улучшает читаемость кода, но не перегружаем им логику.А как вы используете
Optional
в своих проектах? Пишите в комментариях! 👇 👉 @java_geek
Какие подклассы класса Reader вы знаете, для чего они предназначены?
• Reader — абстрактный класс, описывающий символьный ввод;
• BufferedReader — буферизованный входной символьный поток;
• CharArrayReader — входной поток, который читает из символьного массива;
• FileReader — входной поток, читающий файл;
• FilterReader — абстрактный класс, предоставляющий интерфейс для классов-надстроек;
• InputStreamReader — входной поток, транслирующий байты в символы;
• LineNumberReader — входной поток, подсчитывающий строки;
• PipedReader — входной канал;
• PushbackReader — входной поток, позволяющий возвращать символы обратно в поток;
• StringReader — входной поток, читающий из строки.
👉 @java_geek
• Reader — абстрактный класс, описывающий символьный ввод;
• BufferedReader — буферизованный входной символьный поток;
• CharArrayReader — входной поток, который читает из символьного массива;
• FileReader — входной поток, читающий файл;
• FilterReader — абстрактный класс, предоставляющий интерфейс для классов-надстроек;
• InputStreamReader — входной поток, транслирующий байты в символы;
• LineNumberReader — входной поток, подсчитывающий строки;
• PipedReader — входной канал;
• PushbackReader — входной поток, позволяющий возвращать символы обратно в поток;
• StringReader — входной поток, читающий из строки.
👉 @java_geek
🎯 Как я использую Lombok и почему всё ещё не отказываюсь от него
Сегодня хочу поделиться своим подходом к Lombok. Несмотря на то, что вокруг него давно идут споры, я по-прежнему использую его в ряде проектов — и вот почему.
✅ Где он уместен
- DTO, VO, Entity классы — здесь Lombok помогает избежать рутинного кода (
- В тестах — аннотация
❗ Где избегаю
- В бизнес-логике. Я стараюсь писать явный код — особенно в сервисах и core-слоях.
- В публичных API — особенно если библиотека/модуль будет использоваться другими командами.
📌 Почему не отказываюсь полностью
Да, можно заменить Lombok на
- Lombok поддерживает больше шаблонов.
- С ним проще мигрировать legacy-код.
- Иногда экономит часы в больших моделях.
💡 Мой совет: ставьте аннотацию
👉 @java_geek
Сегодня хочу поделиться своим подходом к Lombok. Несмотря на то, что вокруг него давно идут споры, я по-прежнему использую его в ряде проектов — и вот почему.
✅ Где он уместен
- DTO, VO, Entity классы — здесь Lombok помогает избежать рутинного кода (
@Getter
, @Setter
, @ToString
, @EqualsAndHashCode
и т.д.).- В тестах — аннотация
@Builder
отлично упрощает создание объектов.❗ Где избегаю
- В бизнес-логике. Я стараюсь писать явный код — особенно в сервисах и core-слоях.
- В публичных API — особенно если библиотека/модуль будет использоваться другими командами.
📌 Почему не отказываюсь полностью
Да, можно заменить Lombok на
record
, Java 21+ или использовать IDE-генерацию. Но:- Lombok поддерживает больше шаблонов.
- С ним проще мигрировать legacy-код.
- Иногда экономит часы в больших моделях.
💡 Мой совет: ставьте аннотацию
@Generated
(или комментарий) на код, который создан Lombok, чтобы проще было понять, откуда что взялось. А если хотите больше контроля — попробуйте MapStruct + ручные мапперы.👉 @java_geek
🧩 Зачем нужен Optional в Java и когда его НЕ стоит использовать
Сегодня хочу поговорить об одном из самых спорных классов Java —
🔍 Когда использовать
1. В сигнатурах методов, чтобы явно показать, что возвращаемое значение может отсутствовать:
2. Для цепочек преобразований:
3. Вместо
🚫 Когда НЕ нужно использовать
- В полях сущностей и DTO —
- В параметрах методов — это ломает читаемость и не даёт реальной пользы.
- Внутри циклов/алгоритмов с частым вызовом —
- При сериализации — может вызвать проблемы с Jackson и другими библиотеками.
💡 Лайфхак: если ты всё же используешь
👉 @java_geek
Сегодня хочу поговорить об одном из самых спорных классов Java —
Optional
. Часто вижу, как его используют "на автомате", не задумываясь, а ведь у него есть конкретные кейсы применения и ограничения.🔍 Когда использовать
Optional
?1. В сигнатурах методов, чтобы явно показать, что возвращаемое значение может отсутствовать:
public Optional<User> findUserById(String id)
2. Для цепочек преобразований:
Optional.ofNullable(user)
.map(User::getProfile)
.map(Profile::getAddress)
.ifPresent(System.out::println);
3. Вместо
null
при возврате значений — это делает код более читаемым и безопасным.🚫 Когда НЕ нужно использовать
Optional
:- В полях сущностей и DTO —
Optional
не предназначен для хранения состояния.- В параметрах методов — это ломает читаемость и не даёт реальной пользы.
- Внутри циклов/алгоритмов с частым вызовом —
Optional
создаёт дополнительную нагрузку на GC.- При сериализации — может вызвать проблемы с Jackson и другими библиотеками.
💡 Лайфхак: если ты всё же используешь
Optional
, обязательно изучи методы orElse
, orElseGet
и orElseThrow
— у них есть нюансы, о которых часто забывают.👉 @java_geek
📕 Открытый урок по разработке веб-приложений на Scala
На открытом уроке 1 апреля в 20:00 мск мы погрузимся в мир бэкенд-разработки на Scala.
📗 В результате вы:
— Узнаете ключевые аспекты создания современных веб-приложений на Scala;
— Познакомитесь с популярными фреймворками и инструментами для работы с базами данных;
— На практике создадите простое CRUD-приложение для закрепления навыков.
Спикер: Алексей Воронец — руководитель разработки департамента проектных решений и поисковых систем в компании Naumen, эксперт с 14-летним опытом, специализирующийся на Scala и функциональном программировании.
👉 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие
https://vk.cc/cKbrfD
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
На открытом уроке 1 апреля в 20:00 мск мы погрузимся в мир бэкенд-разработки на Scala.
📗 В результате вы:
— Узнаете ключевые аспекты создания современных веб-приложений на Scala;
— Познакомитесь с популярными фреймворками и инструментами для работы с базами данных;
— На практике создадите простое CRUD-приложение для закрепления навыков.
Спикер: Алексей Воронец — руководитель разработки департамента проектных решений и поисковых систем в компании Naumen, эксперт с 14-летним опытом, специализирующийся на Scala и функциональном программировании.
👉 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие
https://vk.cc/cKbrfD
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🧪 Java: тестируем equals() и hashCode() правильно
Сегодня хочу поделиться небольшой, но важной практикой для всех, кто пишет Java-код: проверка корректной реализации equals() и hashCode().
Когда ты переопределяешь эти методы (например, в Entity или DTO), важно убедиться, что они соответствуют контракту и не подводят в коллекциях. Иначе можно словить баг, который очень трудно отследить.
🧰 Как это протестировать:
Используем библиотеку EqualsVerifier — она делает всю грязную работу за нас:
📌 Почему это важно:
- Set, Map, List.contains() и другие структуры полагаются на корректную реализацию этих методов.
- EqualsVerifier проверит: симметрию, транзитивность, согласованность, null и многое другое.
- Он даже предупредит, если ты не добавил final или если поле не включено в сравнение.
🧠 Советы:
- Не пиши equals() вручную — используй Objects.equals() и Objects.hash().
- Если используешь Lombok, просто добавь
Пиши в комментах, сталкивался ли ты с багами из-за equals()`/`hashCode()? Как ты их находил?
👉 @java_geek
Сегодня хочу поделиться небольшой, но важной практикой для всех, кто пишет Java-код: проверка корректной реализации equals() и hashCode().
Когда ты переопределяешь эти методы (например, в Entity или DTO), важно убедиться, что они соответствуют контракту и не подводят в коллекциях. Иначе можно словить баг, который очень трудно отследить.
🧰 Как это протестировать:
Используем библиотеку EqualsVerifier — она делает всю грязную работу за нас:
import nl.jqno.equalsverifier.EqualsVerifier;
public class PersonTest {
@Test
void equalsContract() {
EqualsVerifier.forClass(Person.class).verify();
}
}
📌 Почему это важно:
- Set, Map, List.contains() и другие структуры полагаются на корректную реализацию этих методов.
- EqualsVerifier проверит: симметрию, транзитивность, согласованность, null и многое другое.
- Он даже предупредит, если ты не добавил final или если поле не включено в сравнение.
🧠 Советы:
- Не пиши equals() вручную — используй Objects.equals() и Objects.hash().
- Если используешь Lombok, просто добавь
@EqualsAndHashCode
.Пиши в комментах, сталкивался ли ты с багами из-за equals()`/`hashCode()? Как ты их находил?
👉 @java_geek
Подборка Telegram каналов для программистов
https://www.tgoop.com/bash_srv Bash Советы
https://www.tgoop.com/win_sysadmin Системный Администратор Windows
https://www.tgoop.com/lifeproger Жизнь программиста. Авторский канал.
https://www.tgoop.com/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://www.tgoop.com/rabota1C_rus Вакансии для программистов 1С
Системное администрирование 📌
https://www.tgoop.com/sysadmin_girl Девочка Сисадмин
https://www.tgoop.com/srv_admin_linux Админские угодья
https://www.tgoop.com/linux_srv Типичный Сисадмин
https://www.tgoop.com/linux_odmin Linux: Системный администратор
https://www.tgoop.com/devops_star DevOps Star (Звезда Девопса)
https://www.tgoop.com/i_linux Системный администратор
https://www.tgoop.com/linuxchmod Linux
https://www.tgoop.com/sys_adminos Системный Администратор
https://www.tgoop.com/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://www.tgoop.com/sysadminof Книги для админов, полезные материалы
https://www.tgoop.com/i_odmin Все для системного администратора
https://www.tgoop.com/i_odmin_book Библиотека Системного Администратора
https://www.tgoop.com/i_odmin_chat Чат системных администраторов
https://www.tgoop.com/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://www.tgoop.com/sysadminoff Новости Линукс Linux
1C разработка 📌
https://www.tgoop.com/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://www.tgoop.com/DevLab1C 1С:Предприятие 8
Программирование C++📌
https://www.tgoop.com/cpp_lib Библиотека C/C++ разработчика
https://www.tgoop.com/cpp_knigi Книги для программистов C/C++
https://www.tgoop.com/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://www.tgoop.com/pythonofff Python академия. Учи Python быстро и легко🐍
https://www.tgoop.com/BookPython Библиотека Python разработчика
https://www.tgoop.com/python_real Python подборки на русском и английском
https://www.tgoop.com/python_360 Книги по Python Rus
Java разработка 📌
https://www.tgoop.com/BookJava Библиотека Java разработчика
https://www.tgoop.com/java_360 Книги по Java Rus
https://www.tgoop.com/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://www.tgoop.com/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://www.tgoop.com/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://www.tgoop.com/developer_mobila Мобильная разработка
https://www.tgoop.com/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://www.tgoop.com/frontend_1 Подборки для frontend разработчиков
https://www.tgoop.com/frontend_sovet Frontend советы, примеры и практика!
https://www.tgoop.com/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://www.tgoop.com/game_devv Все о разработке игр
Библиотеки 📌
https://www.tgoop.com/book_for_dev Книги для программистов Rus
https://www.tgoop.com/programmist_of Книги по программированию
https://www.tgoop.com/proglb Библиотека программиста
https://www.tgoop.com/bfbook Книги для программистов
https://www.tgoop.com/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://www.tgoop.com/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://www.tgoop.com/bookflow Лекции, видеоуроки, доклады с IT конференций
https://www.tgoop.com/coddy_academy Полезные советы по программированию
https://www.tgoop.com/rust_lib Полезный контент по программированию на Rust
https://www.tgoop.com/golang_lib Библиотека Go (Golang) разработчика
https://www.tgoop.com/itmozg Программисты, дизайнеры, новости из мира IT
https://www.tgoop.com/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://www.tgoop.com/nodejs_lib Подборки по Node js и все что с ним связано
https://www.tgoop.com/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://www.tgoop.com/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://www.tgoop.com/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://www.tgoop.com/thehaking Канал о кибербезопасности
https://www.tgoop.com/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
https://www.tgoop.com/ux_web Статьи, книги для дизайнеров
Математика 📌
https://www.tgoop.com/Pomatematike Канал по математике
https://www.tgoop.com/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://www.tgoop.com/Excel_lifehack
https://www.tgoop.com/tikon_1 Новости высоких технологий, науки и техники💡
https://www.tgoop.com/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://www.tgoop.com/sysadmin_rabota Системный Администратор
https://www.tgoop.com/progjob Вакансии в IT
https://www.tgoop.com/bash_srv Bash Советы
https://www.tgoop.com/win_sysadmin Системный Администратор Windows
https://www.tgoop.com/lifeproger Жизнь программиста. Авторский канал.
https://www.tgoop.com/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://www.tgoop.com/rabota1C_rus Вакансии для программистов 1С
Системное администрирование 📌
https://www.tgoop.com/sysadmin_girl Девочка Сисадмин
https://www.tgoop.com/srv_admin_linux Админские угодья
https://www.tgoop.com/linux_srv Типичный Сисадмин
https://www.tgoop.com/linux_odmin Linux: Системный администратор
https://www.tgoop.com/devops_star DevOps Star (Звезда Девопса)
https://www.tgoop.com/i_linux Системный администратор
https://www.tgoop.com/linuxchmod Linux
https://www.tgoop.com/sys_adminos Системный Администратор
https://www.tgoop.com/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://www.tgoop.com/sysadminof Книги для админов, полезные материалы
https://www.tgoop.com/i_odmin Все для системного администратора
https://www.tgoop.com/i_odmin_book Библиотека Системного Администратора
https://www.tgoop.com/i_odmin_chat Чат системных администраторов
https://www.tgoop.com/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://www.tgoop.com/sysadminoff Новости Линукс Linux
1C разработка 📌
https://www.tgoop.com/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://www.tgoop.com/DevLab1C 1С:Предприятие 8
Программирование C++📌
https://www.tgoop.com/cpp_lib Библиотека C/C++ разработчика
https://www.tgoop.com/cpp_knigi Книги для программистов C/C++
https://www.tgoop.com/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://www.tgoop.com/pythonofff Python академия. Учи Python быстро и легко🐍
https://www.tgoop.com/BookPython Библиотека Python разработчика
https://www.tgoop.com/python_real Python подборки на русском и английском
https://www.tgoop.com/python_360 Книги по Python Rus
Java разработка 📌
https://www.tgoop.com/BookJava Библиотека Java разработчика
https://www.tgoop.com/java_360 Книги по Java Rus
https://www.tgoop.com/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://www.tgoop.com/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://www.tgoop.com/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://www.tgoop.com/developer_mobila Мобильная разработка
https://www.tgoop.com/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://www.tgoop.com/frontend_1 Подборки для frontend разработчиков
https://www.tgoop.com/frontend_sovet Frontend советы, примеры и практика!
https://www.tgoop.com/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://www.tgoop.com/game_devv Все о разработке игр
Библиотеки 📌
https://www.tgoop.com/book_for_dev Книги для программистов Rus
https://www.tgoop.com/programmist_of Книги по программированию
https://www.tgoop.com/proglb Библиотека программиста
https://www.tgoop.com/bfbook Книги для программистов
https://www.tgoop.com/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://www.tgoop.com/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://www.tgoop.com/bookflow Лекции, видеоуроки, доклады с IT конференций
https://www.tgoop.com/coddy_academy Полезные советы по программированию
https://www.tgoop.com/rust_lib Полезный контент по программированию на Rust
https://www.tgoop.com/golang_lib Библиотека Go (Golang) разработчика
https://www.tgoop.com/itmozg Программисты, дизайнеры, новости из мира IT
https://www.tgoop.com/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://www.tgoop.com/nodejs_lib Подборки по Node js и все что с ним связано
https://www.tgoop.com/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://www.tgoop.com/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://www.tgoop.com/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://www.tgoop.com/thehaking Канал о кибербезопасности
https://www.tgoop.com/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
https://www.tgoop.com/ux_web Статьи, книги для дизайнеров
Математика 📌
https://www.tgoop.com/Pomatematike Канал по математике
https://www.tgoop.com/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://www.tgoop.com/Excel_lifehack
https://www.tgoop.com/tikon_1 Новости высоких технологий, науки и техники💡
https://www.tgoop.com/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://www.tgoop.com/sysadmin_rabota Системный Администратор
https://www.tgoop.com/progjob Вакансии в IT
Telegram
Bash Советы
🚀 Секреты и советы по Bash
🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале.
🔹 Автоматизация, скрипты и оптимизация работы в Linux.
🔹 Стать мастером Bash легко – просто подпишись!
💻 Прокачивай терминал вместе с нами! 👇
🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале.
🔹 Автоматизация, скрипты и оптимизация работы в Linux.
🔹 Стать мастером Bash легко – просто подпишись!
💻 Прокачивай терминал вместе с нами! 👇
🧩 Зачем в Java использовать
Сегодня я покажу вам один маленький трюк, который может ускорить вашу Java-программу в разы, если вы работаете с
Когда вы создаёте коллекцию, содержащую перечисления, большинство пишет что-то вроде:
Но в Java есть специализированная реализация —
Вот как это выглядит:
💡 Почему
- Под капотом реализован как битовая маска — супербыстро.
- Использует гораздо меньше памяти, чем обычный
- Все значения в
-
📌 Пример:
Если ты до сих пор не используешь
👉 @java_geek
EnumSet
вместо Set<Enum>
?Сегодня я покажу вам один маленький трюк, который может ускорить вашу Java-программу в разы, если вы работаете с
enum
.Когда вы создаёте коллекцию, содержащую перечисления, большинство пишет что-то вроде:
Set<Day> days = new HashSet<>();
Но в Java есть специализированная реализация —
EnumSet
, которая в десятки раз быстрее, потребляет меньше памяти и гарантирует отсутствие null
.Вот как это выглядит:
EnumSet<Day> days = EnumSet.of(Day.MONDAY, Day.WEDNESDAY);
💡 Почему
EnumSet
лучше:- Под капотом реализован как битовая маска — супербыстро.
- Использует гораздо меньше памяти, чем обычный
HashSet
.- Все значения в
EnumSet
должны быть одного enum
-типа — меньше шансов ошибиться.-
null
туда не добавить — меньше багов.📌 Пример:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
}
EnumSet<Day> workDays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
System.out.println(workDays); // [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]
Если ты до сих пор не используешь
EnumSet
, советую обратить внимание. Особенно в перформанс-критичных задачах — это маленькая оптимизация, которая может дать большую разницу.👉 @java_geek
В Java ошибки
❗
💥 Причина:
JVM не может найти определение класса во время выполнения, хотя он был доступен во время компиляции.
🔍 Частые причины:
1. Класс отсутствует в classpath во время запуска.
- Например, зависимость была на этапе компиляции, но не добавлена в JAR или отсутствует в runtime classpath.
2. Исключение при инициализации класса (
- Если статический блок инициализации выбрасывает исключение, класс считается «не загруженным».
3. Разные classloaders.
- В особенно сложных системах (например, сервлеты, Spring, OSGi), разные classloader'ы могут видеть разные классы.
4. Удалён/переименован класс после компиляции.
❗
💥 Причина:
JVM не может найти метод с указанной сигнатурой в классе во время выполнения.
🔍 Частые причины:
1. Метод существует во время компиляции, но изменён или удалён после:
- Например, библиотека была обновлена, и сигнатура метода изменилась.
2. Несовместимость версий библиотек:
- Одна библиотека компилируется с одной версией зависимости, а в рантайме подключена другая версия (без нужного метода).
3. Переопределение метода в наследнике может не сработать, если структура иерархии классов поменялась между компиляцией и выполнением.
✅ Как диагностировать и решать
1. Проверить classpath:
- Используй
2. Проверить версии зависимостей:
- Инструменты вроде
3. Проверить jar-файлы на наличие нужных классов/методов:
- Распаковать jar:
- Проверить сигнатуры методов с помощью
4. Избегай теневых зависимостей (shadow dependencies).
5. Используй dependency management:
- Например, в Maven зафиксировать версии зависимостей через
👉 @java_geek
NoClassDefFoundError
и NoSuchMethodError
относятся к runtime ошибкам, возникающим в процессе выполнения программы, и обычно связаны с проблемами совместимости, загрузки классов и зависимости.❗
NoClassDefFoundError
💥 Причина:
JVM не может найти определение класса во время выполнения, хотя он был доступен во время компиляции.
🔍 Частые причины:
1. Класс отсутствует в classpath во время запуска.
- Например, зависимость была на этапе компиляции, но не добавлена в JAR или отсутствует в runtime classpath.
2. Исключение при инициализации класса (
ExceptionInInitializerError
).- Если статический блок инициализации выбрасывает исключение, класс считается «не загруженным».
3. Разные classloaders.
- В особенно сложных системах (например, сервлеты, Spring, OSGi), разные classloader'ы могут видеть разные классы.
4. Удалён/переименован класс после компиляции.
❗
NoSuchMethodError
💥 Причина:
JVM не может найти метод с указанной сигнатурой в классе во время выполнения.
🔍 Частые причины:
1. Метод существует во время компиляции, но изменён или удалён после:
- Например, библиотека была обновлена, и сигнатура метода изменилась.
2. Несовместимость версий библиотек:
- Одна библиотека компилируется с одной версией зависимости, а в рантайме подключена другая версия (без нужного метода).
3. Переопределение метода в наследнике может не сработать, если структура иерархии классов поменялась между компиляцией и выполнением.
✅ Как диагностировать и решать
1. Проверить classpath:
- Используй
-verbose:class
при запуске JVM, чтобы увидеть, откуда загружаются классы.2. Проверить версии зависимостей:
- Инструменты вроде
mvn dependency:tree
или gradle dependencies
помогут выявить конфликты.3. Проверить jar-файлы на наличие нужных классов/методов:
- Распаковать jar:
jar tf your-lib.jar
- Проверить сигнатуры методов с помощью
javap
.4. Избегай теневых зависимостей (shadow dependencies).
5. Используй dependency management:
- Например, в Maven зафиксировать версии зависимостей через
<dependencyManagement>
.👉 @java_geek
🧠 Прокачиваем Spring Boot: как исключить лишние автоконфигурации и ускорить старт приложения
Spring Boot — мощная штука, но автоконфигурации могут подгружать тонну ненужного. Это влияет на время старта, объём памяти и даже security.
📌 Как отключить ненужное?
Используйте аннотацию
Пример:
💡 Подсказка: Чтобы понять, что именно подтягивается — включи дебаг логгер:
Он покажет, какие конфигурации были включены, отключены или неактивны.
⚠️ Не отключай вслепую. Некоторые конфигурации могут быть нужны, даже если ты ими не пользуешься напрямую.
🧰 Альтернатива — использовать
📈 Итог: точечный контроль над автоконфигурацией = быстрее, легче, безопаснее.
👉 @java_geek
Spring Boot — мощная штука, но автоконфигурации могут подгружать тонну ненужного. Это влияет на время старта, объём памяти и даже security.
📌 Как отключить ненужное?
Используйте аннотацию
@SpringBootApplication(exclude = {...})
Пример:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
SecurityAutoConfiguration.class
})
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
💡 Подсказка: Чтобы понять, что именно подтягивается — включи дебаг логгер:
logging:
level:
org.springframework.boot.autoconfigure: DEBUG
Он покажет, какие конфигурации были включены, отключены или неактивны.
⚠️ Не отключай вслепую. Некоторые конфигурации могут быть нужны, даже если ты ими не пользуешься напрямую.
🧰 Альтернатива — использовать
spring.factories
или @EnableAutoConfiguration
вручную (чаще — в библиотеках).📈 Итог: точечный контроль над автоконфигурацией = быстрее, легче, безопаснее.
👉 @java_geek
🚀 Подборка Telegram каналов для программистов
Системное администрирование, DevOps 📌
https://www.tgoop.com/bash_srv Bash Советы
https://www.tgoop.com/win_sysadmin Системный Администратор Windows
https://www.tgoop.com/sysadmin_girl Девочка Сисадмин
https://www.tgoop.com/srv_admin_linux Админские угодья
https://www.tgoop.com/linux_srv Типичный Сисадмин
https://www.tgoop.com/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://www.tgoop.com/linux_odmin Linux: Системный администратор
https://www.tgoop.com/devops_star DevOps Star (Звезда Девопса)
https://www.tgoop.com/i_linux Системный администратор
https://www.tgoop.com/linuxchmod Linux
https://www.tgoop.com/sys_adminos Системный Администратор
https://www.tgoop.com/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://www.tgoop.com/sysadminof Книги для админов, полезные материалы
https://www.tgoop.com/i_odmin Все для системного администратора
https://www.tgoop.com/i_odmin_book Библиотека Системного Администратора
https://www.tgoop.com/i_odmin_chat Чат системных администраторов
https://www.tgoop.com/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://www.tgoop.com/sysadminoff Новости Линукс Linux
1C разработка 📌
https://www.tgoop.com/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://www.tgoop.com/DevLab1C 1С:Предприятие 8
https://www.tgoop.com/razrab_1C 1C Разработчик
https://www.tgoop.com/buh1C_prog 1C Программист | Бухгалтерия и Учёт
https://www.tgoop.com/rabota1C_rus Вакансии для программистов 1С
Программирование C++📌
https://www.tgoop.com/cpp_lib Библиотека C/C++ разработчика
https://www.tgoop.com/cpp_knigi Книги для программистов C/C++
https://www.tgoop.com/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://www.tgoop.com/pythonofff Python академия.
https://www.tgoop.com/BookPython Библиотека Python разработчика
https://www.tgoop.com/python_real Python подборки на русском и английском
https://www.tgoop.com/python_360 Книги по Python
Java разработка 📌
https://www.tgoop.com/BookJava Библиотека Java разработчика
https://www.tgoop.com/java_360 Книги по Java Rus
https://www.tgoop.com/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://www.tgoop.com/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://www.tgoop.com/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://www.tgoop.com/developer_mobila Мобильная разработка
https://www.tgoop.com/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://www.tgoop.com/frontend_1 Подборки для frontend разработчиков
https://www.tgoop.com/frontend_sovet Frontend советы, примеры и практика!
https://www.tgoop.com/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://www.tgoop.com/game_devv Все о разработке игр
Библиотеки 📌
https://www.tgoop.com/book_for_dev Книги для программистов Rus
https://www.tgoop.com/programmist_of Книги по программированию
https://www.tgoop.com/proglb Библиотека программиста
https://www.tgoop.com/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://www.tgoop.com/bigdata_1 Big Data, Machine Learning
Программирование 📌
https://www.tgoop.com/bookflow Лекции, видеоуроки, доклады с IT конференций
https://www.tgoop.com/rust_lib Полезный контент по программированию на Rust
https://www.tgoop.com/golang_lib Библиотека Go (Golang) разработчика
https://www.tgoop.com/itmozg Программисты, дизайнеры, новости из мира IT
https://www.tgoop.com/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://www.tgoop.com/nodejs_lib Подборки по Node js и все что с ним связано
https://www.tgoop.com/ruby_lib Библиотека Ruby программиста
https://www.tgoop.com/lifeproger Жизнь программиста. Авторский канал.
QA, тестирование 📌
https://www.tgoop.com/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://www.tgoop.com/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://www.tgoop.com/thehaking Канал о кибербезопасности
https://www.tgoop.com/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
https://www.tgoop.com/ux_web Статьи, книги для дизайнеров
Математика 📌
https://www.tgoop.com/Pomatematike Канал по математике
https://www.tgoop.com/phis_mat Обучающие видео, книги по Физике и Математике
https://www.tgoop.com/matgeoru Математика | Геометрия | Логика
Excel лайфхак📌
https://www.tgoop.com/Excel_lifehack
https://www.tgoop.com/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://www.tgoop.com/sysadmin_rabota Системный Администратор
https://www.tgoop.com/progjob Вакансии в IT
Системное администрирование, DevOps 📌
https://www.tgoop.com/bash_srv Bash Советы
https://www.tgoop.com/win_sysadmin Системный Администратор Windows
https://www.tgoop.com/sysadmin_girl Девочка Сисадмин
https://www.tgoop.com/srv_admin_linux Админские угодья
https://www.tgoop.com/linux_srv Типичный Сисадмин
https://www.tgoop.com/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://www.tgoop.com/linux_odmin Linux: Системный администратор
https://www.tgoop.com/devops_star DevOps Star (Звезда Девопса)
https://www.tgoop.com/i_linux Системный администратор
https://www.tgoop.com/linuxchmod Linux
https://www.tgoop.com/sys_adminos Системный Администратор
https://www.tgoop.com/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://www.tgoop.com/sysadminof Книги для админов, полезные материалы
https://www.tgoop.com/i_odmin Все для системного администратора
https://www.tgoop.com/i_odmin_book Библиотека Системного Администратора
https://www.tgoop.com/i_odmin_chat Чат системных администраторов
https://www.tgoop.com/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://www.tgoop.com/sysadminoff Новости Линукс Linux
1C разработка 📌
https://www.tgoop.com/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://www.tgoop.com/DevLab1C 1С:Предприятие 8
https://www.tgoop.com/razrab_1C 1C Разработчик
https://www.tgoop.com/buh1C_prog 1C Программист | Бухгалтерия и Учёт
https://www.tgoop.com/rabota1C_rus Вакансии для программистов 1С
Программирование C++📌
https://www.tgoop.com/cpp_lib Библиотека C/C++ разработчика
https://www.tgoop.com/cpp_knigi Книги для программистов C/C++
https://www.tgoop.com/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://www.tgoop.com/pythonofff Python академия.
https://www.tgoop.com/BookPython Библиотека Python разработчика
https://www.tgoop.com/python_real Python подборки на русском и английском
https://www.tgoop.com/python_360 Книги по Python
Java разработка 📌
https://www.tgoop.com/BookJava Библиотека Java разработчика
https://www.tgoop.com/java_360 Книги по Java Rus
https://www.tgoop.com/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://www.tgoop.com/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://www.tgoop.com/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://www.tgoop.com/developer_mobila Мобильная разработка
https://www.tgoop.com/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://www.tgoop.com/frontend_1 Подборки для frontend разработчиков
https://www.tgoop.com/frontend_sovet Frontend советы, примеры и практика!
https://www.tgoop.com/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://www.tgoop.com/game_devv Все о разработке игр
Библиотеки 📌
https://www.tgoop.com/book_for_dev Книги для программистов Rus
https://www.tgoop.com/programmist_of Книги по программированию
https://www.tgoop.com/proglb Библиотека программиста
https://www.tgoop.com/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://www.tgoop.com/bigdata_1 Big Data, Machine Learning
Программирование 📌
https://www.tgoop.com/bookflow Лекции, видеоуроки, доклады с IT конференций
https://www.tgoop.com/rust_lib Полезный контент по программированию на Rust
https://www.tgoop.com/golang_lib Библиотека Go (Golang) разработчика
https://www.tgoop.com/itmozg Программисты, дизайнеры, новости из мира IT
https://www.tgoop.com/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://www.tgoop.com/nodejs_lib Подборки по Node js и все что с ним связано
https://www.tgoop.com/ruby_lib Библиотека Ruby программиста
https://www.tgoop.com/lifeproger Жизнь программиста. Авторский канал.
QA, тестирование 📌
https://www.tgoop.com/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://www.tgoop.com/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://www.tgoop.com/thehaking Канал о кибербезопасности
https://www.tgoop.com/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
https://www.tgoop.com/ux_web Статьи, книги для дизайнеров
Математика 📌
https://www.tgoop.com/Pomatematike Канал по математике
https://www.tgoop.com/phis_mat Обучающие видео, книги по Физике и Математике
https://www.tgoop.com/matgeoru Математика | Геометрия | Логика
Excel лайфхак📌
https://www.tgoop.com/Excel_lifehack
https://www.tgoop.com/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://www.tgoop.com/sysadmin_rabota Системный Администратор
https://www.tgoop.com/progjob Вакансии в IT
Telegram
Bash Советы
🚀 Секреты и советы по Bash
🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале.
🔹 Автоматизация, скрипты и оптимизация работы в Linux.
🔹 Стать мастером Bash легко – просто подпишись!
💻 Прокачивай терминал вместе с нами! 👇
🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале.
🔹 Автоматизация, скрипты и оптимизация работы в Linux.
🔹 Стать мастером Bash легко – просто подпишись!
💻 Прокачивай терминал вместе с нами! 👇
Какими свойствами обладает порождаемое equals() отношение эквивалентности?
☕️ Рефлексивность: для любой ссылки на значение x, x.equals(x) вернет true;
☕️ Симметричность: для любых ссылок на значения x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) возвращает true.
☕️ Транзитивность: для любых ссылок на значения x, y и z, если x.equals(y) и y.equals(z) возвращают true, тогда и x.equals(z) вернёт true;
☕️ Непротиворечивость: для любых ссылок на значения х и у, если несколько раз вызвать х.equals(y), постоянно будет возвращаться значение true либо постоянно будет возвращаться значение false при условии, что никакая информация, используемая при сравнении объектов, не поменялась.
Для любой ненулевой ссылки на значение х выражение х.equals(null) должно возвращать false.
👉 @java_geek
☕️ Рефлексивность: для любой ссылки на значение x, x.equals(x) вернет true;
☕️ Симметричность: для любых ссылок на значения x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) возвращает true.
☕️ Транзитивность: для любых ссылок на значения x, y и z, если x.equals(y) и y.equals(z) возвращают true, тогда и x.equals(z) вернёт true;
☕️ Непротиворечивость: для любых ссылок на значения х и у, если несколько раз вызвать х.equals(y), постоянно будет возвращаться значение true либо постоянно будет возвращаться значение false при условии, что никакая информация, используемая при сравнении объектов, не поменялась.
Для любой ненулевой ссылки на значение х выражение х.equals(null) должно возвращать false.
👉 @java_geek
Ленивая инициализация бинов в Spring Boot 3.
Обычно все бины поднимаются на старте приложения. Это может тормозить загрузку, особенно если есть тяжёлые компоненты (например, коннекторы к БД или внешним сервисам).
📌 Как включить ленивую инициализацию всех бинов:
Или через
💡 Тогда бины будут создаваться только при первом использовании, а не при старте.
⚠️ Когда стоит использовать:
- Для ускорения старта больших приложений.
- При разработке — быстрее ребилд и перезапуск.
⚠️ Когда лучше избегать:
- В продакшене, где важно заранее поймать ошибки конфигурации.
- Когда нужна предсказуемость старта и работы приложения.
🧠 Можно включать ленивую инициализацию точечно:
👉 @java_geek
Обычно все бины поднимаются на старте приложения. Это может тормозить загрузку, особенно если есть тяжёлые компоненты (например, коннекторы к БД или внешним сервисам).
📌 Как включить ленивую инициализацию всех бинов:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MyApplication.class);
app.setLazyInitialization(true);
app.run(args);
}
}
Или через
application.properties
:
spring.main.lazy-initialization=true
💡 Тогда бины будут создаваться только при первом использовании, а не при старте.
⚠️ Когда стоит использовать:
- Для ускорения старта больших приложений.
- При разработке — быстрее ребилд и перезапуск.
⚠️ Когда лучше избегать:
- В продакшене, где важно заранее поймать ошибки конфигурации.
- Когда нужна предсказуемость старта и работы приложения.
🧠 Можно включать ленивую инициализацию точечно:
@Component
@Lazy
public class HeavyService {
// Поднимется только когда реально понадобится
}
👉 @java_geek
🧠
Сегодня покажу вам, почему аннотация
Допустим, у вас такой конфиг:
📌 Проблема #1: Плохая валидация
Если значение в
📌 Проблема #2: Нет автокомплита
IDE не сможет подсказать, какие свойства вообще есть. Рефакторинг ключей — боль.
📌 Проблема #3: Тестирование
Труднее подменить значения в тестах:
✅ Современный подход — использовать
И в
💡 Spring сам сконвертирует
⚠️ Не забудьте включить бин:
📌 Резюме:
👉 @java_geek
@Value
— тихая ловушка Spring'аСегодня покажу вам, почему аннотация
@Value
— не лучший выбор для работы с конфигурацией, особенно в Spring Boot 3+.Допустим, у вас такой конфиг:
@Value("${app.timeout:30}")
private int timeout;
📌 Проблема #1: Плохая валидация
Если значение в
application.yaml
невалидное (например, timeout: abc), приложение *упадёт при старте*, но вы получите лишь общее сообщение Failed to bind…
, без точной причины.📌 Проблема #2: Нет автокомплита
IDE не сможет подсказать, какие свойства вообще есть. Рефакторинг ключей — боль.
📌 Проблема #3: Тестирование
Труднее подменить значения в тестах:
@Value
не так просто "подсунуть" моками.✅ Современный подход — использовать
@ConfigurationProperties
:
@ConfigurationProperties(prefix = "app")
@Configuration
public class AppProperties {
private Duration timeout = Duration.ofSeconds(30);
// геттеры/сеттеры
}
И в
application.yaml
:
app:
timeout: 30s
💡 Spring сам сконвертирует
30s
в Duration
, поддержит автокомплит в IDE, и вы сможете валидировать значения с @Validated
.⚠️ Не забудьте включить бин:
@EnableConfigurationProperties(AppProperties.class)
📌 Резюме:
@Value
— для быстрых хаков. Для серьёзной конфигурации — @ConfigurationProperties
.👉 @java_geek
🧠 Проблема ленивой инициализации
Когда вы используете
📌 Типичный баг:
🔍 Если где-то в коде вызвать
⚠️ В результате — метод выполнится без транзакции, и вы не поймёте почему.
💡 Как избежать:
* Никогда не используйте
* Лучше разделите логику: сервис без прокси — отдельно, бизнес-методы с
✅ Надёжный способ: вызывать
👉 @java_geek
@Transactional
-сервисов в Spring BootКогда вы используете
@Transactional
на методе сервиса, Spring оборачивает бин в прокси. Но если вы решите сделать ленивую инициализацию (@Lazy
) или внедрите такой бин в другой с помощью ObjectProvider.getIfAvailable()
или @Autowired(required = false)
— есть риск неожиданного поведения.📌 Типичный баг:
@Service
@Lazy
public class MyService {
@Transactional
public void doSomething() {
// ...
}
}
🔍 Если где-то в коде вызвать
applicationContext.getBean(MyService.class)
в момент, когда прокси ещё не создан — вы получите оригинальный, не-прокси-объект. А значит, @Transactional
не сработает.⚠️ В результате — метод выполнится без транзакции, и вы не поймёте почему.
💡 Как избежать:
* Никогда не используйте
@Lazy
или ленивое получение @Transactional
-сервисов, если не понимаете нюансов проксирования.* Лучше разделите логику: сервис без прокси — отдельно, бизнес-методы с
@Transactional
— в другом бине.✅ Надёжный способ: вызывать
@Transactional
-методы только через Spring-контейнер. Даже внутри самого сервиса — через self-injection:
@Service
public class MyService {
private final MyService self;
public MyService(@Lazy MyService self) {
this.self = self;
}
public void doWrapper() {
self.doTransactional(); // прокси работает
}
@Transactional
public void doTransactional() {
// ...
}
}
👉 @java_geek
🧠 Ленивая инициализация бинов в Spring Boot 3 — когда это спасает прод
Иногда на проде случаются сбои при старте из-за тяжёлых или нестабильных бинов. Это может быть внешняя интеграция, длительная инициализация или просто нестабильный ресурс. В таких случаях поможет ленивая инициализация.
📌 Как включить ленивую инициализацию глобально:
📌 Или в
💡 Бины будут создаваться только при первом запросе к ним. Это уменьшает время старта и помогает "пережить" временные проблемы.
⚠️ Минусы:
* Ошибки сдвигаются с этапа запуска на runtime.
* Если бин важен для старта (например, контроллер или Scheduler), его лучше инициализировать сразу.
📌 Тонкая настройка:
Хотите ленивую инициализацию только для части приложения?
💡 Работает и с
📈 Используйте в микросервисах с большим числом зависимостей или при миграции на Spring Boot 3+, где время старта стало критичным (например, в serverless-архитектуре).
👉 @java_geek
Иногда на проде случаются сбои при старте из-за тяжёлых или нестабильных бинов. Это может быть внешняя интеграция, длительная инициализация или просто нестабильный ресурс. В таких случаях поможет ленивая инициализация.
📌 Как включить ленивую инициализацию глобально:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
app.setLazyInitialization(true);
app.run(args);
}
}
📌 Или в
application.yml
:
spring:
main:
lazy-initialization: true
💡 Бины будут создаваться только при первом запросе к ним. Это уменьшает время старта и помогает "пережить" временные проблемы.
⚠️ Минусы:
* Ошибки сдвигаются с этапа запуска на runtime.
* Если бин важен для старта (например, контроллер или Scheduler), его лучше инициализировать сразу.
📌 Тонкая настройка:
Хотите ленивую инициализацию только для части приложения?
@Lazy
@Component
public class HeavyService {
// ...
}
💡 Работает и с
@Bean
, @Service
, @Repository
.📈 Используйте в микросервисах с большим числом зависимостей или при миграции на Spring Boot 3+, где время старта стало критичным (например, в serverless-архитектуре).
👉 @java_geek
14 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqvEJJNG
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Почему
В Spring
📌 Прокси перехватывает только ВНЕШНИЕ вызовы метода.
Если вы вызываете
Пример:
💡 Даже если вы сделаете метод
⚠️ Аннотация
✅ Правильный подход:
Вынесите транзакционный метод в отдельный бин:
И используйте его из другого бина:
📌 Или используйте аспектно-ориентированную реализацию с
👉 @java_geek
@Transactional
не работает в private-методах?В Spring
@Transactional
работает через прокси. Это значит, что Spring оборачивает бин в обёртку, которая и управляет транзакцией. Но есть важный нюанс:📌 Прокси перехватывает только ВНЕШНИЕ вызовы метода.
Если вы вызываете
@Transactional
-метод изнутри того же класса, транзакция не начнётся.Пример:
@Service
public class UserService {
public void createUser() {
// вызов внутреннего метода — транзакция не активируется
saveUser();
}
@Transactional
private void saveUser() {
// НЕ будет работать как транзакционный
}
}
💡 Даже если вы сделаете метод
public
, но вызов будет из того же класса — эффект тот же: Spring-прокси его не "перехватит".⚠️ Аннотация
@Transactional
не работает на private
-методах вообще. Прокси просто не может их подменить.✅ Правильный подход:
Вынесите транзакционный метод в отдельный бин:
@Service
public class UserSaver {
@Transactional
public void saveUser() {
// теперь работает!
}
}
И используйте его из другого бина:
@Service
public class UserService {
private final UserSaver userSaver;
public UserService(UserSaver userSaver) {
this.userSaver = userSaver;
}
public void createUser() {
userSaver.saveUser(); // транзакция начнётся
}
}
📌 Или используйте аспектно-ориентированную реализацию с
@EnableAspectJAutoProxy(exposeProxy = true)
+ AopContext.currentProxy()
, но это уже хардкор.👉 @java_geek
🚀 Открой для себя идеальный путь к лидерству с карьерным тестом от ОЭЗ «Алабуга»! 🌟
Мечтаете о карьере в крупной компании, где ваш потенциал раскроется на полную? Наш тест поможет вам определить вашу уникальную лидерскую роль. Может быть, именно вы станете тем лидером, который выведет команду на новый уровень?
После прохождения теста вы можете заполнить заявку и получить приглашение на эксклюзивную лидерскую программу. Участие в программе открывает реальные перспективы трудоустройства в ОЭЗ «Алабуга», предоставляя шанс начать путь к профессиональному признанию.
Сделайте первый шаг к своему будущему сегодня! Пройдите тест, подайте заявку и начните строить свою карьеру вместе с нами. 🎯
Мечтаете о карьере в крупной компании, где ваш потенциал раскроется на полную? Наш тест поможет вам определить вашу уникальную лидерскую роль. Может быть, именно вы станете тем лидером, который выведет команду на новый уровень?
После прохождения теста вы можете заполнить заявку и получить приглашение на эксклюзивную лидерскую программу. Участие в программе открывает реальные перспективы трудоустройства в ОЭЗ «Алабуга», предоставляя шанс начать путь к профессиональному признанию.
Сделайте первый шаг к своему будущему сегодня! Пройдите тест, подайте заявку и начните строить свою карьеру вместе с нами. 🎯
Метод isEmpty()
👉 @java_geek
isEmpty()
– проверяет список на наличие элементов. Если список пустой, то возвращает true, в противном случае – false.👉 @java_geek