Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
- Telegram Web
Telegram Web
🛠️ Разбираем `Optional` в Java: когда стоит использовать?

Сегодня поговорим о 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
🎯 Как я использую Lombok и почему всё ещё не отказываюсь от него

Сегодня хочу поделиться своим подходом к 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 — 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
🧪 Java: тестируем equals() и hashCode() правильно

Сегодня хочу поделиться небольшой, но важной практикой для всех, кто пишет 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
🧩 Зачем в Java использовать 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 ошибки 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.

📌 Как отключить ненужное?

Используйте аннотацию @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
Какими свойствами обладает порождаемое 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
Ленивая инициализация бинов в Spring Boot 3.

Обычно все бины поднимаются на старте приложения. Это может тормозить загрузку, особенно если есть тяжёлые компоненты (например, коннекторы к БД или внешним сервисам).

📌 Как включить ленивую инициализацию всех бинов:


@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
🧠 @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
🧠 Проблема ленивой инициализации @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 — когда это спасает прод

Иногда на проде случаются сбои при старте из-за тяжёлых или нестабильных бинов. Это может быть внешняя интеграция, длительная инициализация или просто нестабильный ресурс. В таких случаях поможет ленивая инициализация.

📌 Как включить ленивую инициализацию глобально:


@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
🔍Тестовое собеседование на Middle Java-разработчика завтра

14 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Константин Лесняк, Java-разработчик с большим опытом проведения собесов, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Костя будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Косте

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. 

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqvEJJNG
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Почему @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()

isEmpty() – проверяет список на наличие элементов. Если список пустой, то возвращает true, в противном случае – false.

👉 @java_geek
2025/05/31 02:27:47
Back to Top
HTML Embed Code: