🚀 Подпишись и прокачай свои скилы: лучшие каналы для IT-специалистов 👨💻📲
Папка с каналами для DevOps, Linux - Windows СисАдминов👍
Папка с каналами для 1С программистов🧑💻
Папка с каналами для C++ программистов👩💻
Папка с каналами для Python программистов👩💻
Папка с каналами для Java программистов🖥
Папка с книгами для программистов 📚
Папка для программистов (frontend, backend, iOS, Android)💻
GitHub Сообщество🧑💻
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base)🖥
https://t.me/database_info Все про базы данных
Разработка игр📱
https://t.me/game_devv Все о разработке игр
БигДата, машинное обучение🖥
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
QA, тестирование🖥
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность💻
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free
Книги, статьи для дизайнеров🎨
https://t.me/ux_web Статьи, книги для дизайнеров
Математика🧮
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак🙃
https://t.me/Excel_lifehack
Технологии🖥
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии💰
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
https://t.me/rabota1C_rus Вакансии для программистов 1С
Папка с каналами для DevOps, Linux - Windows СисАдминов
Папка с каналами для 1С программистов
Папка с каналами для C++ программистов
Папка с каналами для Python программистов
Папка с каналами для Java программистов
Папка с книгами для программистов 📚
Папка для программистов (frontend, backend, iOS, Android)
GitHub Сообщество
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base)
https://t.me/database_info Все про базы данных
Разработка игр
https://t.me/game_devv Все о разработке игр
БигДата, машинное обучение
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
QA, тестирование
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free
Книги, статьи для дизайнеров
https://t.me/ux_web Статьи, книги для дизайнеров
Математика
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак
https://t.me/Excel_lifehack
Технологии
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
https://t.me/rabota1C_rus Вакансии для программистов 1С
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Админ Devops
You’ve been invited to add the folder “Админ Devops”, which includes 18 chats.
🔍 Почему
Привет! Сегодня хочу поделиться одной из часто встречающихся ошибок при использовании
Многие разработчики, особенно начинающие, начинают использовать
📌 Ключевая идея
А не заменять все поля и параметры на
Примеры плохой практики:
Почему это плохо:
- Увеличивается сложность сериализации (особенно с Jackson, GSON).
- Не соответствует архитектурной задумке:
- Проблемы с JPA (Hibernate не дружит с Optional-полями).
- Понижается читаемость кода.
💡 Лучше использовать
То есть
Если кратко:
- ✅ Используй
- ❌ Не используй
А ты как используешь
👉@BookJava
Optional
— это не замена null
везде и всегдаПривет! Сегодня хочу поделиться одной из часто встречающихся ошибок при использовании
Optional
в Java.Многие разработчики, особенно начинающие, начинают использовать
Optional
везде, где может быть null
, думая, что это автоматически делает код "безопасным". Но так ли это?📌 Ключевая идея
Optional
— сигнализировать о возможном отсутствии значения в результате вызова метода. А не заменять все поля и параметры на
Optional
.Примеры плохой практики:
public class User {
private Optional<String> name; // ❌ Не нужно так делать
}
Почему это плохо:
- Увеличивается сложность сериализации (особенно с Jackson, GSON).
- Не соответствует архитектурной задумке:
Optional
— это не контейнер для полей.- Проблемы с JPA (Hibernate не дружит с Optional-полями).
- Понижается читаемость кода.
💡 Лучше использовать
Optional
вот так:
public Optional<User> findUserById(Long id) {
// Возвращаем Optional, потому что пользователь может не существовать
}
То есть
Optional
— это про контракт на метод, а не про хранение данных.Если кратко:
- ✅ Используй
Optional
в сигнатурах методов, когда результат может отсутствовать.- ❌ Не используй
Optional
в полях и параметрах конструктора.А ты как используешь
Optional
в проектах? Был ли опыт с его неправильным применением? Пиши в комментах👇👉@BookJava
👍7❤4💩1
🧠
Многие знают, что можно заинжектить список строк из
Но знаете, что вы получите?
⚠️ ОШИБКУ.
📌 Решение — использовать
💡 Профит:
- работает с
- валидация через
- легко покрыть тестами;
- меньше магии.
⚠️
👉@BookJava
@Value
в Spring — это ловушка, если вы используете списки или map'ыМногие знают, что можно заинжектить список строк из
application.yml
вот так:
app:
langs:
- en
- fr
- de
@Value("${app.langs}")
private List<String> langs;
Но знаете, что вы получите?
⚠️ ОШИБКУ.
@Value
не умеет парсить YAML-массивы. Он ожидает строку, и даже с CSV-строкой (en,fr,de
) — всё не так очевидно: Spring не применяет ConversionService
для списков.📌 Решение — использовать
@ConfigurationProperties
:
app:
langs:
- en
- fr
- de
@ConfigurationProperties(prefix = "app")
@Component
public class AppProps {
private List<String> langs;
// геттеры/сеттеры
}
💡 Профит:
- работает с
List
, Map
, вложенными объектами;- валидация через
@Validated
и @NotEmpty
;- легко покрыть тестами;
- меньше магии.
⚠️
@Value
хорош для простых скаляров. Всё остальное — через @ConfigurationProperties
.👉@BookJava
👍23🔥4
🛡Хотите строить защищенные и масштабируемые микросервисы с помощью ASP.NET Core?
Присоединяйтесь к открытому уроку 17 апреля в 20:00 МСК и узнайте, как создать безопасные микросервисы с использованием JWT, OpenID Connect, и .NET Aspire. Мы разберем, как защитить API, оптимизировать производительность и внедрить современные подходы к аутентификации и авторизации.
❗️ Что разберем:
- Принципы и преимущества архитектуры микросервисов.
- Защиту API с использованием JWT и OpenID Connect.
- Инструменты .NET Aspire для оркестрации сервисов и настройки окружения.
- Реальные шаги по созданию микросервисов, настройке безопасности и работе с Docker.
🚀 Урок пройдет в преддверии старта курса «C# ASP.NET Core разработчик». 🎁 Все участники получат скидку на обучение по промокоду: ASP_NET_04.
Присоединяйтесь: https://vk.cc/cKOiH1
Промокод действителен до 28.04.2025
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Присоединяйтесь к открытому уроку 17 апреля в 20:00 МСК и узнайте, как создать безопасные микросервисы с использованием JWT, OpenID Connect, и .NET Aspire. Мы разберем, как защитить API, оптимизировать производительность и внедрить современные подходы к аутентификации и авторизации.
- Принципы и преимущества архитектуры микросервисов.
- Защиту API с использованием JWT и OpenID Connect.
- Инструменты .NET Aspire для оркестрации сервисов и настройки окружения.
- Реальные шаги по созданию микросервисов, настройке безопасности и работе с Docker.
Присоединяйтесь: https://vk.cc/cKOiH1
Промокод действителен до 28.04.2025
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠
Часто вижу, как даже опытные разработчики по привычке используют
⚠️ Но с ростом приложения
📌 Лучший подход — использовать
✅ Преимущества
- 💡 Группирует настройки логически
- 🔍 Работает с валидацией (
- 📚 Отлично поддерживается IDE (автокомплит, рефакторинг)
- 🔧 Удобно тестировать и мокать
🆕 Начиная с Spring Boot 2.2+, можно использовать record-классы и просто зарегистрировать бин через
💬 Так что, если у вас в проекте до сих пор десятки
👉@BookJava
@Value
vs @ConfigurationProperties
— кого выбрать?Часто вижу, как даже опытные разработчики по привычке используют
@Value
для инъекции конфигурации:
@Value("${app.timeout}")
private Duration timeout;
⚠️ Но с ростом приложения
@Value
становится хрупким и неудобным.📌 Лучший подход — использовать
@ConfigurationProperties
:
@ConfigurationProperties(prefix = "app")
public record AppProperties(Duration timeout, String apiKey) {}
@Bean
@ConfigurationPropertiesBinding
public AppProperties appProperties() {
return new AppProperties();
}
✅ Преимущества
@ConfigurationProperties
:- 💡 Группирует настройки логически
- 🔍 Работает с валидацией (
@Validated
, @NotNull
, и т.д.)- 📚 Отлично поддерживается IDE (автокомплит, рефакторинг)
- 🔧 Удобно тестировать и мокать
🆕 Начиная с Spring Boot 2.2+, можно использовать record-классы и просто зарегистрировать бин через
@EnableConfigurationProperties
:
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {}
💬 Так что, если у вас в проекте до сих пор десятки
@Value
— самое время навести порядок.👉@BookJava
👍5❤2
GRASP: почему настоящая архитектура начинается не с SOLID
Хочу начать с личной предыстории. Давным‑давно, как и многие из вас, я читал умные книжки: «Чистый код» и «Чистая архитектура» Роберта Мартина, «Совершенный код» Стива Макконнелла и другие.
Также не обошли меня и классические принципы проектирования — SOLID, KISS, DRY — и, думаю, каждый читатель добавит сюда свои.
Безусловно, это всё важные и фундаментальные вещи.
Но однажды на горизонте появилось DDD — предметно‑ориентированное проектирование в изложении Эрика Эванса. Именно его «синяя книга» стала культовой и задала язык для архитектурного мышления.
Позже я открыл и «красную книгу» Вона Вернона, где DDD уже рассматривался с точки зрения практической имплементации: архитектура, код, реальные подходы в проектах.
Читая Эванса, рассматривая его диаграммы классов и примеры кода, я всё думал: как он это делает?
https://habr.com/ru/articles/900140/
👉@BookJava
Хочу начать с личной предыстории. Давным‑давно, как и многие из вас, я читал умные книжки: «Чистый код» и «Чистая архитектура» Роберта Мартина, «Совершенный код» Стива Макконнелла и другие.
Также не обошли меня и классические принципы проектирования — SOLID, KISS, DRY — и, думаю, каждый читатель добавит сюда свои.
Безусловно, это всё важные и фундаментальные вещи.
Но однажды на горизонте появилось DDD — предметно‑ориентированное проектирование в изложении Эрика Эванса. Именно его «синяя книга» стала культовой и задала язык для архитектурного мышления.
Позже я открыл и «красную книгу» Вона Вернона, где DDD уже рассматривался с точки зрения практической имплементации: архитектура, код, реальные подходы в проектах.
Читая Эванса, рассматривая его диаграммы классов и примеры кода, я всё думал: как он это делает?
https://habr.com/ru/articles/900140/
👉@BookJava
👍2
Остался всего 1 день, чтобы прокачать асинхронный код на Scala Future 📢
15 апреля в 18:30 пройдёт открытый вебинар с Валентином Шилиным — старшим программистом и аналитиком данных Deutsche Telekom IT GmbH, экспертом по большим данным и преподавателем курсов по Scala и Apache Spark. Он расскажет:
— как избегать типичных ошибок (блокировки и потерю контекста)
— как комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions)
— как ускорить и упростить написание кода на Scala
❗️ Если вы хотите перейти с Java на Scala или уже используете Play Framework, Akka или Spark — на вебинаре вы узнаете, как грамотно писать асинхронный код и устранять «подводные камни».
Каждый участник:
— сможет задать вопросы эксперту
— получит скидку на полный курс по Scala-разработке
👉 Не упустите шанс перейти на новый уровень — регистрируйтесь, остался 1 день
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
15 апреля в 18:30 пройдёт открытый вебинар с Валентином Шилиным — старшим программистом и аналитиком данных Deutsche Telekom IT GmbH, экспертом по большим данным и преподавателем курсов по Scala и Apache Spark. Он расскажет:
— как избегать типичных ошибок (блокировки и потерю контекста)
— как комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions)
— как ускорить и упростить написание кода на Scala
❗️ Если вы хотите перейти с Java на Scala или уже используете Play Framework, Akka или Spark — на вебинаре вы узнаете, как грамотно писать асинхронный код и устранять «подводные камни».
Каждый участник:
— сможет задать вопросы эксперту
— получит скидку на полный курс по Scala-разработке
👉 Не упустите шанс перейти на новый уровень — регистрируйтесь, остался 1 день
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❤2
🧠 Частая ловушка при работе с
Сейчас покажу вам один распространённый анти-паттерн, который легко пропустить — вызов транзакционного метода внутри того же класса.
📌 Пример:
💥 Проблема:
Spring не применит транзакцию к
Spring AOP работает через прокси, и
⚠️ Это может привести к очень странным багам: вы думаете, что транзакция есть, а её нет.
💡 Как исправить:
1. Вынести метод в отдельный бин:
2. Или использовать
✅ Всегда проверяйте, как вызываются методы с
👉@BookJava
@Transactional
в SpringСейчас покажу вам один распространённый анти-паттерн, который легко пропустить — вызов транзакционного метода внутри того же класса.
📌 Пример:
@Service
public class UserService {
@Transactional
public void registerUser(UserDto dto) {
saveUser(dto);
}
@Transactional
public void saveUser(UserDto dto) {
// сохранение пользователя
}
}
💥 Проблема:
Spring не применит транзакцию к
saveUser()
, потому что вызов происходит внутри одного и того же бина — минуя прокси.Spring AOP работает через прокси, и
@Transactional
"срабатывает", только если метод вызывается извне, через прокси-объект.⚠️ Это может привести к очень странным багам: вы думаете, что транзакция есть, а её нет.
💡 Как исправить:
1. Вынести метод в отдельный бин:
@Service
public class UserSaver {
@Transactional
public void save(UserDto dto) {
// сохраняем
}
}
@Service
public class UserService {
private final UserSaver saver;
public UserService(UserSaver saver) {
this.saver = saver;
}
public void registerUser(UserDto dto) {
saver.save(dto);
}
}
2. Или использовать
TransactionTemplate
вручную.✅ Всегда проверяйте, как вызываются методы с
@Transactional
. Особенно при рефакторинге!👉@BookJava
👍14💩3
❓ Разработчики, интересуетесь стримингом, хайлоадом и видеотехнологиями?
⏰ 22 апреля на митапе VK Видео техлиды и топ-менеджеры расскажут, как, например, устанавливают CDN.
Если вы бэкендер, мобильный разработчик или работаете с ML — будет много полезных кейсов из продакшена и возможность задать вопросы тем, кто строит крупнейшую видеоплатформу.
🎯 Узнаете, как устроена архитектура VK Видео, как выстроены команды и какие задачи сейчас в приоритете.
👉Загляните под капот VK Видео
⏰ 22 апреля на митапе VK Видео техлиды и топ-менеджеры расскажут, как, например, устанавливают CDN.
Если вы бэкендер, мобильный разработчик или работаете с ML — будет много полезных кейсов из продакшена и возможность задать вопросы тем, кто строит крупнейшую видеоплатформу.
🎯 Узнаете, как устроена архитектура VK Видео, как выстроены команды и какие задачи сейчас в приоритете.
👉Загляните под капот VK Видео
👍3❤2🔥1💩1
🧠 Как ускорить cold start Spring Boot приложения
Как можно сократить время старта Spring Boot 3+ приложения — без GraalVM и без магии.
📌 Используем флаг:
💡 Что это такое?
Это встроенный механизм кэширования ApplicationContext, появившийся в Spring Boot 3.2.
Он сохраняет результат построения контекста и позволяет повторно использовать его между запусками, особенно в тестах и development-сценариях.
⚙️ Как работает:
- При первом запуске контекст билдится как обычно.
- Затем сериализуется и сохраняется на диск.
- При следующем запуске он подгружается из кеша (если не изменился), что даёт ускорение в 2-3 раза и больше.
🚀 Отлично подходит для:
- Тестов (
- Dev tools и локального запуска;
- Разработки больших монолитов.
⚠️ Не влияет на продакшн (там кеш не используется по умолчанию)
⚠️ Не поддерживает все конфигурации (например, динамические настройки могут инвалидировать кеш)
Простой флаг — а экономит кучу времени каждый день.
👉@BookJava
Как можно сократить время старта Spring Boot 3+ приложения — без GraalVM и без магии.
📌 Используем флаг:
-Dspring.context.cache.applicationContext=true
💡 Что это такое?
Это встроенный механизм кэширования ApplicationContext, появившийся в Spring Boot 3.2.
Он сохраняет результат построения контекста и позволяет повторно использовать его между запусками, особенно в тестах и development-сценариях.
⚙️ Как работает:
- При первом запуске контекст билдится как обычно.
- Затем сериализуется и сохраняется на диск.
- При следующем запуске он подгружается из кеша (если не изменился), что даёт ускорение в 2-3 раза и больше.
🚀 Отлично подходит для:
- Тестов (
@SpringBootTest
);- Dev tools и локального запуска;
- Разработки больших монолитов.
⚠️ Не влияет на продакшн (там кеш не используется по умолчанию)
⚠️ Не поддерживает все конфигурации (например, динамические настройки могут инвалидировать кеш)
Простой флаг — а экономит кучу времени каждый день.
👉@BookJava
👍6❤2
🧠 ThreadLocal — скрытая угроза утечек памяти
ThreadLocal — удобный способ хранить данные, привязанные к потоку. Например, для
📌 Почему?
ThreadLocal-хранилище (
Пример:
⚠️ Что пойдёт не так без
- Поток из пула закончит обрабатывать запрос, но
- Если
- И так накапливается утечка.
💡 Советы:
- Всегда вызывай
- Для Spring можно использовать
- Проверяй код сторонних библиотек, если они используют
👉@BookJava
ThreadLocal — удобный способ хранить данные, привязанные к потоку. Например, для
SimpleDateFormat
или текущего пользователя в рамках запроса. Но с ним легко получить утечку памяти, особенно в thread pool'ах.📌 Почему?
ThreadLocal-хранилище (
Thread.threadLocals
) живёт столько же, сколько поток. А потоки из пулов живут долго. Если ты забыл вызвать remove()
— данные останутся в памяти навсегда.Пример:
private static final ThreadLocal<UserContext> context = ThreadLocal.withInitial(UserContext::new);
public void handleRequest() {
try {
context.set(new UserContext("user123"));
// работа с контекстом
} finally {
context.remove(); // ОБЯЗАТЕЛЬНО!
}
}
⚠️ Что пойдёт не так без
remove()
?- Поток из пула закончит обрабатывать запрос, но
UserContext
останется висеть в ThreadLocalMap
этого потока.- Если
UserContext
содержит ссылки на другие объекты (например, HttpSession
, EntityManager
и т.д.) — вся эта цепочка не будет GC-шиться.- И так накапливается утечка.
💡 Советы:
- Всегда вызывай
remove()
в finally
.- Для Spring можно использовать
RequestScope
или @ControllerAdvice
вместо ThreadLocal
.- Проверяй код сторонних библиотек, если они используют
ThreadLocal
, особенно в фильтрах и интерсепторах.👉@BookJava
👍8
❓Сталкиваетесь с задачами, когда вам нужно выбрать лучший алгоритм, но не понимаете, как анализировать их сложность? Ваш код может быть медленным или неэффективным, и вы не знаете, как это исправить?
📗На открытом вебинаре 21 апреля в 20:00 мск вы освоите важные инструменты для анализа сложности алгоритмов, улучшите свой навык решения алгоритмических задач и на примере простых алгоритмов сортировки и увидите разницу при применении алгоритмов разной степени сложности.
➡️Регистрируйтесь прямо сейчас и получите скидку на большое обучение «C# Developer» по промокоду SHARP_SPEC_4: https://vk.cc/cKRCrB
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📗На открытом вебинаре 21 апреля в 20:00 мск вы освоите важные инструменты для анализа сложности алгоритмов, улучшите свой навык решения алгоритмических задач и на примере простых алгоритмов сортировки и увидите разницу при применении алгоритмов разной степени сложности.
➡️Регистрируйтесь прямо сейчас и получите скидку на большое обучение «C# Developer» по промокоду SHARP_SPEC_4: https://vk.cc/cKRCrB
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
💡 Ленивая инициализация бинов в Spring Boot — мощный инструмент ускорения старта
По умолчанию Spring инициализирует все singleton-бины при запуске приложения. Это может быть проблемой в больших проектах: старт медленный, а половина бинов не нужна сразу.
📌 Как ускорить старт и снизить потребление памяти? — Lazy Init!
✅ Глобально:
Все бины станут ленивыми — создадутся только при первом обращении. Это может сократить старт приложения на 30-60%!
✅ Локально (избирательно):
Или через
🧠 Когда использовать:
- В dev-окружении — чтобы ускорить локальный dev cycle.
- В CLI/Batch-приложениях, где используется 1-2 бина.
- Когда есть тяжёлые бины, не нужные на старте (например, интеграции, большие клиенты и т.п.).
⚠️ Осторожно:
- Если забыть
- Некоторые бины должны быть загружены сразу (например,
👉@BookJava
По умолчанию Spring инициализирует все singleton-бины при запуске приложения. Это может быть проблемой в больших проектах: старт медленный, а половина бинов не нужна сразу.
📌 Как ускорить старт и снизить потребление памяти? — Lazy Init!
✅ Глобально:
spring:
main:
lazy-initialization: true
Все бины станут ленивыми — создадутся только при первом обращении. Это может сократить старт приложения на 30-60%!
✅ Локально (избирательно):
@Component
@Lazy
public class HeavyBean {
public HeavyBean() {
System.out.println("HeavyBean init...");
}
}
Или через
@Lazy
на зависимостях:
@Service
public class MyService {
public MyService(@Lazy HeavyBean heavyBean) {
this.heavyBean = heavyBean;
}
}
🧠 Когда использовать:
- В dev-окружении — чтобы ускорить локальный dev cycle.
- В CLI/Batch-приложениях, где используется 1-2 бина.
- Когда есть тяжёлые бины, не нужные на старте (например, интеграции, большие клиенты и т.п.).
⚠️ Осторожно:
- Если забыть
@Lazy
на зависимостях, Spring всё равно создаст бин.- Некоторые бины должны быть загружены сразу (например,
@Scheduled
, @EventListener
), иначе они не сработают.👉@BookJava
👍5
👩💻 JDBC — ваш швейцарский нож для работы с данными
Приглашаем на открытый урок.
🗓 22 апреля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».
О чём поговорим:
✔️ Основы JDBC: что это такое, зачем нужно и как работает
✔️ Практические примеры выполнения сложных запросов
✔️ Работа с транзакциями и обработка ошибок в JDBC
✔️ Оптимизация производительности при работе с данными через JDBC
Кому будет интересно:
Вебинар будет полезен разработчикам, инженерам по базам данных и архитекторам ПО, стремящимся улучшить навыки работы с базами данных и оптимизировать взаимодействие с данными.
В результате урока:
Вы научитесь эффективно использовать JDBC для работы с базами данных и сможете применять полученные знания в реальных проектах
🔗 Ссылка на регистрацию: https://vk.cc/cKRDCS
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Приглашаем на открытый урок.
🗓 22 апреля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».
О чём поговорим:
Кому будет интересно:
Вебинар будет полезен разработчикам, инженерам по базам данных и архитекторам ПО, стремящимся улучшить навыки работы с базами данных и оптимизировать взаимодействие с данными.
В результате урока:
Вы научитесь эффективно использовать JDBC для работы с базами данных и сможете применять полученные знания в реальных проектах
🔗 Ссылка на регистрацию: https://vk.cc/cKRDCS
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🧠 Как ускорить загрузку контекста Spring Boot — простой приём
Если у вас тяжёлый Spring Boot-приложение с кучей конфигураций и бинов, время старта может легко вырасти до 20–30 секунд и больше. Сегодня покажу приём, который помогает ускорить cold start за счёт отключения ненужных автоматических конфигураций.
📌 Spring Boot автоконфигурация — это палка о двух концах.
Она упрощает старт, но часто тянет за собой кучу лишнего. Особенно если вы используете
💡 Решение — использовать
❗️Это особенно актуально:
- в микросервисах без UI (отключаем MVC)
- если datasource создаётся вручную
- в тестах и lightweight-режимах
👀 Как понять, что мешает?
1. Запусти приложение с флагом
2. Посмотри, какие автоконфигурации "matched", но тебе не нужны.
3. Добавь их в
🧰 Альтернатива — использовать аннотацию
⚠️ Не переусердствуй: отключение нужной конфигурации может привести к тихим багам. Лучше вырезать по одной и смотреть на эффект.
👉 Это один из способов сделать Spring Boot предсказуемым и быстрым, особенно в CI/CD или serverless-окружениях.
👉@BookJava
Если у вас тяжёлый Spring Boot-приложение с кучей конфигураций и бинов, время старта может легко вырасти до 20–30 секунд и больше. Сегодня покажу приём, который помогает ускорить cold start за счёт отключения ненужных автоматических конфигураций.
📌 Spring Boot автоконфигурация — это палка о двух концах.
Она упрощает старт, но часто тянет за собой кучу лишнего. Особенно если вы используете
@SpringBootApplication
, которая включает в себя @EnableAutoConfiguration
.💡 Решение — использовать
spring.autoconfigure.exclude
, чтобы явно выключить ненужное. Например:
# application.yaml
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
❗️Это особенно актуально:
- в микросервисах без UI (отключаем MVC)
- если datasource создаётся вручную
- в тестах и lightweight-режимах
👀 Как понять, что мешает?
1. Запусти приложение с флагом
--debug
или логгером org.springframework.boot.autoconfigure
уровня DEBUG.2. Посмотри, какие автоконфигурации "matched", но тебе не нужны.
3. Добавь их в
exclude
.🧰 Альтернатива — использовать аннотацию
@ImportAutoConfiguration
с явным списком нужных автоконфигураций. Это тонкая настройка, идеально для библиотек и SDK.⚠️ Не переусердствуй: отключение нужной конфигурации может привести к тихим багам. Лучше вырезать по одной и смотреть на эффект.
👉 Это один из способов сделать Spring Boot предсказуемым и быстрым, особенно в CI/CD или serverless-окружениях.
👉@BookJava
👍6
🧠 Простое ускорение
Знаете, что
Это значит:
- Внутренние вызовы в том же классе не проходят через транзакцию;
- Каждый такой прокси — это AOP-магия, которую можно обойти ради производительности.
📌 Если вы точно знаете, что метод будет вызываться только извне, и вам не нужна прокси-обёртка — используйте
📉 Это немного снижает overhead, особенно в высоконагруженных сервисах, где сотни тысяч вызовов
💡 Подходит, если:
- У вас слоистая архитектура;
- Транзакции нужны только снаружи;
- Вы не используете вызовы
⚠️ Не забывайте:
- JDK Proxy работает только с интерфейсами;
- Если вызываете методы внутри того же класса — прокси не сработает (и транзакция не начнётся).
📊 Профильте. Иногда замена
👉@BookJava
@Transactional
методов в Spring BootЗнаете, что
@Transactional
по умолчанию оборачивает метод в прокси?Это значит:
- Внутренние вызовы в том же классе не проходят через транзакцию;
- Каждый такой прокси — это AOP-магия, которую можно обойти ради производительности.
📌 Если вы точно знаете, что метод будет вызываться только извне, и вам не нужна прокси-обёртка — используйте
@Transactional
на уровне интерфейса и включите interface-based proxy.
@Configuration
@EnableTransactionManagement(proxyTargetClass = false) // JDK proxy
public class TransactionConfig {
}
public interface UserService {
@Transactional
void createUser(User user);
}
📉 Это немного снижает overhead, особенно в высоконагруженных сервисах, где сотни тысяч вызовов
@Transactional
-методов.💡 Подходит, если:
- У вас слоистая архитектура;
- Транзакции нужны только снаружи;
- Вы не используете вызовы
this.someMethod()
внутри сервиса.⚠️ Не забывайте:
- JDK Proxy работает только с интерфейсами;
- Если вызываете методы внутри того же класса — прокси не сработает (и транзакция не начнётся).
📊 Профильте. Иногда замена
proxyTargetClass = true
на false
даёт +3-5% к throughput.👉@BookJava
👍7
Хотите глубже разобраться в функциональном программировании и писать более качественный код на Scala? Приходите на вебинар в Otus
24 апреля в 20:00 пройдёт открытый вебинар с Алексеем Воронцом — руководителем разработки в Naumen, 14 лет опыта, из них 9 лет на Scala. На практических примерах он покажет:
— почему Scala — функциональный язык
— как работать с ключевыми библиотеками
— как повысить выразительность кода
❗️ Если вы уже знакомы со Scala или только начинаете к нему присматриваться и хотите развивать функциональный подход в своих проектах — этот вебинар для вас.
Каждый участник:
— сможет задать вопросы эксперту
— получит скидку на полный курс по Scala-разработке
👉 Регистрируйтесь и сделайте свой код лучше
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
24 апреля в 20:00 пройдёт открытый вебинар с Алексеем Воронцом — руководителем разработки в Naumen, 14 лет опыта, из них 9 лет на Scala. На практических примерах он покажет:
— почему Scala — функциональный язык
— как работать с ключевыми библиотеками
— как повысить выразительность кода
❗️ Если вы уже знакомы со Scala или только начинаете к нему присматриваться и хотите развивать функциональный подход в своих проектах — этот вебинар для вас.
Каждый участник:
— сможет задать вопросы эксперту
— получит скидку на полный курс по Scala-разработке
👉 Регистрируйтесь и сделайте свой код лучше
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍2👎1
🧠 Сейчас покажу баг, который легко пропустить при работе с
📌 Проблема — транзакция не работает, потому что метод вызывается изнутри того же класса.
Рассмотрим пример:
💥 Если
✅ Решения:
1. Вынести transactional-метод в отдельный бин:
2. Внедрить self-прокси:
3. Использовать
⚠️ Не забудь включить
💡 Современный подход — разделение ответственности: transactional-методы живут в отдельных сервисах, их проще тестировать и не возникает подобных ловушек.
👉@BookJava
@Transactional
в Spring Boot 3+.📌 Проблема — транзакция не работает, потому что метод вызывается изнутри того же класса.
Рассмотрим пример:
@Service
public class UserService {
@Transactional
public void createUser(User user) {
saveUser(user);
sendWelcomeEmail(user); // бросает исключение
}
public void saveUser(User user) {
userRepository.save(user);
}
}
💥 Если
sendWelcomeEmail
выбросит исключение — транзакция не откатится, потому что @Transactional
работает через прокси. Вызов createUser()
должен идти извне, чтобы Spring "знал", что нужно обернуть вызов в транзакцию.✅ Решения:
1. Вынести transactional-метод в отдельный бин:
@Service
public class UserCreationService {
@Transactional
public void createUser(User user) {
// ...
}
}
2. Внедрить self-прокси:
@Autowired
private UserService self;
public void externalCaller(User user) {
self.createUser(user);
}
3. Использовать
AopContext
:
((UserService) AopContext.currentProxy()).createUser(user);
⚠️ Не забудь включить
exposeProxy = true
в @EnableAspectJAutoProxy
.💡 Современный подход — разделение ответственности: transactional-методы живут в отдельных сервисах, их проще тестировать и не возникает подобных ловушек.
👉@BookJava
👍7❤1
🧠 Lazy Initialization по-взрослому: не создавай проблемы на ровном месте
В Spring Boot часто можно встретить вот такую конструкцию:
⚠️ Проблема:
📌 Решение — ленивая инициализация, но не через старый добрый
💡 Способ #1:
Можно и без Guava:
💡 Способ #2: через Spring
🧵 Итог:
- Не инициализируй тяжёлые объекты зря.
- Используй
- Это особенно критично для тестов, лямбд и кэширования.
👉@BookJava
В Spring Boot часто можно встретить вот такую конструкцию:
@Service
public class EmailService {
private final SmtpClient client = new SmtpClient(); // дорогая инициализация
}
⚠️ Проблема:
SmtpClient
создаётся сразу при старте приложения. Даже если EmailService
ни разу не вызовется. Это не только waste of resources, но и может сломать запуск, если SmtpClient
требует специфического окружения.📌 Решение — ленивая инициализация, но не через старый добрый
null
-check, а красиво, безопасно и читаемо:💡 Способ #1:
Lazy<T>
wrapper
@Component
public class EmailService {
private final Supplier<SmtpClient> client = Suppliers.memoize(SmtpClient::new);
public void sendEmail(...) {
client.get().send(...);
}
}
Можно и без Guava:
public class Lazy<T> {
private Supplier<T> supplier;
public Lazy(Supplier<T> supplier) {
this.supplier = () -> {
T value = supplier.get();
this.supplier = () -> value;
return value;
};
}
public T get() {
return supplier.get();
}
}
💡 Способ #2: через Spring
@Service
public class EmailService {
private final ObjectProvider<SmtpClient> client;
public EmailService(ObjectProvider<SmtpClient> client) {
this.client = client;
}
public void sendEmail(...) {
client.getObject().send(...);
}
}
🧵 Итог:
- Не инициализируй тяжёлые объекты зря.
- Используй
Supplier
, ObjectProvider
или Lazy<T>
.- Это особенно критично для тестов, лямбд и кэширования.
👉@BookJava
👍9
🧠 Spring Boot 3.2+: ускоряем стартап с помощью
Spring Boot 3.2 по умолчанию включает сбор Micrometer Observation метрик — даже если вы не используете Prometheus, Datadog и пр.
Это полезно, но часто избыточно — особенно в микросервисах, где важна скорость старта.
📌 Что это даёт?
- Отключает автоконфигурацию
- Убирает связанные
- Сокращает время старта до 30-60% (в зависимости от контекста)
💡 Как применить?
В
Или так, если используешь
⚠️ Важно: это не отключает другие метрики Micrometer.
Это касается только новой подсистемы Observation — она полезна для трассировки, но не всегда нужна.
📎 Документация Micrometer Observation
👉@BookJava
application.metrics.export.observation.enabled=false
Spring Boot 3.2 по умолчанию включает сбор Micrometer Observation метрик — даже если вы не используете Prometheus, Datadog и пр.
Это полезно, но часто избыточно — особенно в микросервисах, где важна скорость старта.
📌 Что это даёт?
- Отключает автоконфигурацию
ObservationRegistry
- Убирает связанные
Bean
'ы- Сокращает время старта до 30-60% (в зависимости от контекста)
💡 Как применить?
В
application.yml
или application.properties
:
management:
metrics:
export:
observation:
enabled: false
Или так, если используешь
.properties
:
management.metrics.export.observation.enabled=false
⚠️ Важно: это не отключает другие метрики Micrometer.
Это касается только новой подсистемы Observation — она полезна для трассировки, но не всегда нужна.
📎 Документация Micrometer Observation
👉@BookJava
👍3