📊 MQCloud — корпоративный центр управления RocketMQ.
Это единая платформа, которая объединяет управление очередями, мониторинг и алертинг в одном интерфейсе.
Сервис уже обслуживает десятки серверов, сотни топиков и миллиарды сообщений ежедневно. Он умеет показывать топологию кластеров, детализацию по производителям и потребителям, а также предупреждать о проблемах вроде скопления сообщений или сбоев.
Особенно удобно, что MQCloud разграничивает права: обычные пользователи видят только свои очереди, а администраторы получают полный контроль с возможностью согласования изменений.
🖥 GitHub
Подписывайся на наш канал в Max🟪
Это единая платформа, которая объединяет управление очередями, мониторинг и алертинг в одном интерфейсе.
Сервис уже обслуживает десятки серверов, сотни топиков и миллиарды сообщений ежедневно. Он умеет показывать топологию кластеров, детализацию по производителям и потребителям, а также предупреждать о проблемах вроде скопления сообщений или сбоев.
Особенно удобно, что MQCloud разграничивает права: обычные пользователи видят только свои очереди, а администраторы получают полный контроль с возможностью согласования изменений.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🔥3
🔥Приглашаем на бесплатный вебинар курса “Software Architect”: «Способы разделения микросервисов»
Когда: 29 октября, 20:00 (мск)
О вебинаре
Узнайте, как проектировать масштабируемые микросервисные архитектуры. На открытом уроке курса Software Architect разберём, как разделять микросервисы, чтобы упростить разработку и повысить устойчивость систем.
Что узнаете:
- Применение DDD для декомпозиции микросервисов.
- Разделение сервисов по бизнес-функциям и данным.
- Практические кейсы для гибкости архитектуры.
Что освоите:
- Принципы эффективной декомпозиции.
- Методы для масштабируемых архитектур.
- Практические инструменты для проектов.
👉 Регистрируйтесь: https://vk.cc/cQJWcH
Занятие приурочено к старту курса "Software Architect", обучение на котором позволит освоить компетенции архитектора по моделированию и построению отказоустойчивых, масштабируемых информационных систем.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Когда: 29 октября, 20:00 (мск)
О вебинаре
Узнайте, как проектировать масштабируемые микросервисные архитектуры. На открытом уроке курса Software Architect разберём, как разделять микросервисы, чтобы упростить разработку и повысить устойчивость систем.
Что узнаете:
- Применение DDD для декомпозиции микросервисов.
- Разделение сервисов по бизнес-функциям и данным.
- Практические кейсы для гибкости архитектуры.
Что освоите:
- Принципы эффективной декомпозиции.
- Методы для масштабируемых архитектур.
- Практические инструменты для проектов.
👉 Регистрируйтесь: https://vk.cc/cQJWcH
Занятие приурочено к старту курса "Software Architect", обучение на котором позволит освоить компетенции архитектора по моделированию и построению отказоустойчивых, масштабируемых информационных систем.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
❤2👍2🔥2😁1
Совет по Java 👩💻
Чтобы сделать большие и сложные цепочки компараторов более читаемыми, мне нравится присваивать компараторы переменным, имена которых начинаются с "by". Таким образом, вызов
Подписывайся на наш канал в Max🟪
Чтобы сделать большие и сложные цепочки компараторов более читаемыми, мне нравится присваивать компараторы переменным, имена которых начинаются с "by". Таким образом, вызов
sorted() становится меньше и читается почти как естественный язык. Кроме того, вы можете использовать статический импорт.Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤🔥12🔥2❤1
Казалось бы, три похожих ключевых слова → final, finally, finalize(). А смысл принципиально разный. Давайте разберёмся.
Модификатор, который делает сущность неизменяемой:
Используется для обеспечения immutability и контрактов в коде.
Блок в try-catch, который выполняется всегда (даже если выброшено исключение).
Гарантирует освобождение ресурсов:
try {
FileReader reader = new FileReader("data.txt");
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("Закрываем ресурсы");
}
Метод класса Object, вызываемый GC перед удалением объекта. Используется редко, считается устаревшим (deprecated с Java 9, удалён в Java 18).
Минус: непредсказуемое время вызова.
Современная альтернатива: try-with-resources или явная очистка.
final → контроль изменяемости.
finally → контроль завершения.
finalize() → контроль очистки (но не используйте).
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4🔥2
LinkedList — это классическая реализация двусвязного списка. На поверхности он выглядит как обычная коллекция, реализующая интерфейсы List, Deque и Queue. Но под капотом это структура узлов (Node), которые связаны друг с другом через ссылки на предыдущий и следующий элемент.
📦 Базовая структура
Каждый элемент списка хранится в отдельном объекте Node<E>, который содержит:
У LinkedList есть два поля:
Это позволяет быстро добавлять элементы в начало и конец.
⚡️ Добавление и удаление
— Добавление в начало (addFirst) или конец (addLast) → O(1): меняем ссылки у пары узлов.
— Удаление головы или хвоста также → O(1).
— Вставка или удаление в середине требует сначала дойти до нужного узла → O(n).
🌊 Поиск элемента
— По индексу: список не хранит массив, значит придётся идти по ссылкам.
— Оптимизация: если индекс ближе к голове, обход идёт с first, если к хвосту — с last.
Сложность в среднем — O(n/2), то есть линейная.
📊 Производительность
— Доступ по индексу → O(n).
— Добавление/удаление в начало или конец → O(1).
— Вставка/удаление в середину → O(n).
— Итерация по списку → O(n), но эффективно, так как используется последовательный проход по ссылкам.
⚖️ Важные нюансы
— В отличие от ArrayList, в LinkedList нет операций с массивами и «ресайзинга».
— Но расходует больше памяти: каждый узел хранит не только элемент, но и две ссылки (prev/next).
— Итераторы fail-fast: изменение списка во время обхода бросает ConcurrentModificationException.
🔄 Итераторы и Deque
LinkedList реализует Deque, что делает его удобным для очередей и стеков. Offer, poll, peek работают за O(1). Push/pop превращают список в стек.
🧮 Когда использовать
На практике ArrayList почти всегда быстрее по времени и эффективнее по памяти.
LinkedList может быть полезен только в редких случаях, когда нужны очень частые вставки/удаления в середину коллекции (без итерации по коллекции) и не важен доступ по индексу. В остальных случаях выбирайте ArrayList.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤5🔥4🎅1
29 октября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью по System Design.
Как это будет:
📂 Дмитрий Дорофеев, TeamLead в американском FitTech Truv Inc, ex-VK, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Дмитрий будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Дмитрию
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥2
Как устроен кеш в Spring Boot?
Spring Boot упрощает кеширование благодаря аннотациям и встроенной интеграции с разными кеш-провайдерами (EhCache, Caffeine, Redis и др.). Spring использует Spring Cache Abstraction, которая оборачивает кеширующую логику в аннотации:
🔘 @Cacheable — кладёт результат в кеш
🔘 @CachePut — обновляет кеш
🔘 @CacheEvict — удаляет из кеша
За кулисами используется прокси (через Spring AOP или CGLIB), который перехватывает вызовы методов, проверяет кеш и возвращает либо сохранённое значение, либо выполняет метод и кеширует результат.
🔍 Что под капотом
Если вызвать метод с @Cacheable, Spring выполняет несколько шагов:
1. Определяет ключ кеша
🔘 По умолчанию ключ формируется из параметров метода
🔘 Можно задать кастомный ключ через key = "#id"
2. Проверяет кеш-провайдер
🔘 Дефолтный провайдер — ConcurrentHashMap
🔘 Можно подключить Redis, Caffeine, EhCache и т. д.
3. Возвращает данные
🔘 Если значение есть в кеше — сразу отдаётся
🔘 Если нет – вызывается метод и результат сохраняется в кеше
⚠️ Нюансы
— Кеш работает только для Spring-управляемых бинов (если метод вызван внутри того же класса — кеш не сработает)
— Не кешируйте изменяемые объекты, иначе возможны неожиданные побочные эффекты
— Очищайте кеш, если данные меняются (@CacheEvict)
Подписывайся на наш канал в Max🟪
Spring Boot упрощает кеширование благодаря аннотациям и встроенной интеграции с разными кеш-провайдерами (EhCache, Caffeine, Redis и др.). Spring использует Spring Cache Abstraction, которая оборачивает кеширующую логику в аннотации:
За кулисами используется прокси (через Spring AOP или CGLIB), который перехватывает вызовы методов, проверяет кеш и возвращает либо сохранённое значение, либо выполняет метод и кеширует результат.
Если вызвать метод с @Cacheable, Spring выполняет несколько шагов:
1. Определяет ключ кеша
2. Проверяет кеш-провайдер
3. Возвращает данные
— Кеш работает только для Spring-управляемых бинов (если метод вызван внутри того же класса — кеш не сработает)
— Не кешируйте изменяемые объекты, иначе возможны неожиданные побочные эффекты
— Очищайте кеш, если данные меняются (@CacheEvict)
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥4❤3
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3❤2
public class Mystery {
public static void main(String[] args) {
System.out.println(method(true) + method(false));
}
static String method(boolean flag) {
return flag ? "Yes" : "No";
}
static String method(String val) {
return val.toUpperCase();
}
}
Что выведет программа, пишите в комментариях?
A) YesNo
B) YESNO
C) Ошибка компиляции
D) null
✅ Правильный ответ:
➡️ Вызов
method(true)method(false)method(boolean)Результат:
"YesNo"method(String)Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤8🔥3
Пост вызывает непреодолимое желание пройти тест по мобильному тестированию 🐞
Заранее предупреждаем и дарим 1 000 бонусов
Пора переключиться с QA-тестов на квиз по мобильной разработке. Посмотрите на привычные вопросы с другого ракурса.
В Академии Selectel выпустили квиз для тестировщиков. Если вы запускаете релизы мобильных приложений, нужно знать базу о популярных крашах.
Пройдите тест и получите промокод на 1 000 бонусов на продукты и услуги Selectel: https://slc.tl/vivco
Реклама. АО "Селектел". erid:2W5zFHC8Q5N
Заранее предупреждаем и дарим 1 000 бонусов
Пора переключиться с QA-тестов на квиз по мобильной разработке. Посмотрите на привычные вопросы с другого ракурса.
В Академии Selectel выпустили квиз для тестировщиков. Если вы запускаете релизы мобильных приложений, нужно знать базу о популярных крашах.
Пройдите тест и получите промокод на 1 000 бонусов на продукты и услуги Selectel: https://slc.tl/vivco
Реклама. АО "Селектел". erid:2W5zFHC8Q5N
❤2👍2🔥2
Оптимизация работы с JDBC в высоконагруженных приложениях
Неэффективное использование JDBC может легко стать узким местом и убить производительность. Вот пошаговый разбор, как сделать работу с JDBC быстрее и стабильнее.
1️⃣ Настраиваем connection pool
Используйте HikariCP, Apache DBCP или C3P0 вместо стандартного DriverManager. Это позволит переиспользовать соединения, а не открывать новое на каждый запрос.
2️⃣ Используем подготовленные запросы (PreparedStatement)
Во-первых, это снижает нагрузку на базу за счёт кеширования плана запроса. Во-вторых, убирает SQL-инъекции на уровне JDBC.
3️⃣ Выбираем правильный тип курсора ResultSet
— TYPE_FORWARD_ONLY, если нужно просто пробежать по данным.
— TYPE_SCROLL_INSENSITIVE позволяет скроллить данные, но требует больше памяти.
— TYPE_SCROLL_SENSITIVE редко нужен, но обновляет данные в реальном времени.
4️⃣ Ограничиваем выборку данных (LIMIT / FETCH FIRST)
Не забирайте сразу всю таблицу – старайтесь выбирать только нужные поля и ограничивать количество строк.
5️⃣ Выключаем автокоммиты
По умолчанию, каждый запрос в JDBC – это отдельная транзакция. Включите setAutoCommit(false) и коммитите изменения пачками, чтобы уменьшить нагрузку.
6️⃣ Логируем медленные запросы
Если какие-то SQL-запросы выполняются слишком долго – используйте SLF4J + P6Spy или встроенные средства логирования в пуле соединений, чтобы их отлавливать.
❓ Какие техники считаете самыми полезными?
Подписывайся на наш канал в Max🟪
Неэффективное использование JDBC может легко стать узким местом и убить производительность. Вот пошаговый разбор, как сделать работу с JDBC быстрее и стабильнее.
Используйте HikariCP, Apache DBCP или C3P0 вместо стандартного DriverManager. Это позволит переиспользовать соединения, а не открывать новое на каждый запрос.
Во-первых, это снижает нагрузку на базу за счёт кеширования плана запроса. Во-вторых, убирает SQL-инъекции на уровне JDBC.
— TYPE_FORWARD_ONLY, если нужно просто пробежать по данным.
— TYPE_SCROLL_INSENSITIVE позволяет скроллить данные, но требует больше памяти.
— TYPE_SCROLL_SENSITIVE редко нужен, но обновляет данные в реальном времени.
Не забирайте сразу всю таблицу – старайтесь выбирать только нужные поля и ограничивать количество строк.
По умолчанию, каждый запрос в JDBC – это отдельная транзакция. Включите setAutoCommit(false) и коммитите изменения пачками, чтобы уменьшить нагрузку.
Если какие-то SQL-запросы выполняются слишком долго – используйте SLF4J + P6Spy или встроенные средства логирования в пуле соединений, чтобы их отлавливать.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍8❤7🔥4
Ответ — в нефункциональных требованиях. Производительность, отказоустойчивость, безопасность и наблюдаемость не «подкручиваются потом» — они с первого дня меняют архитектуру, стек и бюджет.
На открытом уроке «Влияние нефункциональных требований на архитектуру» разберём, как собирать НФТ, переводить их в архитектурные решения и аргументировать выбор стейкхолдерам. Поговорим о trade-off’ах, SLA/SLO, масштабируемости и цене качества.
Присоединяйтесь 11 ноября в 20:00 МСК. Урок проходит в преддверии старта курса «System Design».
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3🔥2
🔐 Bouncy Castle — криптографическая библиотека для Java с открытым кодом. Это решение поддерживает широкий спектр алгоритмов — от базовых шифровальных схем до сложных протоколов вроде S/MIME и OpenPGP.
Проект имеет модульную структуру с разделением на core, JCE-провайдер и специализированные модули для работы с сертификатами X.509 и TLS. Библиотека совместима даже с устаревшими версиями Java, включая J2ME, а сборка теперь поддерживает JDK 21.
🖥 GitHub
Подписывайся на наш канал в Max🟪
Проект имеет модульную структуру с разделением на core, JCE-провайдер и специализированные модули для работы с сертификатами X.509 и TLS. Библиотека совместима даже с устаревшими версиями Java, включая J2ME, а сборка теперь поддерживает JDK 21.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3🔥3
Фишка дебага в IntelliJ IDEA: Reset Frame
Если вам приходилось перезапускать весь дебаг из-за ошибки в анализе кода, есть лучший способ – Reset Frame. Он позволяет откатить выполнение метода и повторить его выполнение с начала, без полной перезагрузки приложения.
🟢 Как использовать
1. Запускаем дебаг и доходим до брейкпоинта.
2. Открываем окно Debug.
3. Во вкладке Frames (стек вызовов) выбираем нужный метод.
4. Нажимаем ПКМ → Reset Frame.
5. Код откатится на вход в метод, как будто вы только что в него зашли.
🟢 Когда это полезно
— Ошиблись при анализе и хотите пересмотреть состояние переменных
— Нужно повторно выполнить метод, не перезапуская весь процесс
— Дебажите рекурсию или сложные цепочки вызовов
⚠️ Важно
— Reset Frame не откатывает глобальные изменения (например, изменения в базе или внешних файлах).
— Он работает только в пределах одного метода – не выйдет вернуть выполнение назад на несколько вызовов.
▪️ Как использовать Reset Frame эффективнее
Можно комбинировать его с Evaluate Expression, чтобы перед повторным вызовом метода изменять переменные вручную.
❓ Пользовались Reset Frame раньше или только узнали?
✅ Java библиотека #java
Если вам приходилось перезапускать весь дебаг из-за ошибки в анализе кода, есть лучший способ – Reset Frame. Он позволяет откатить выполнение метода и повторить его выполнение с начала, без полной перезагрузки приложения.
1. Запускаем дебаг и доходим до брейкпоинта.
2. Открываем окно Debug.
3. Во вкладке Frames (стек вызовов) выбираем нужный метод.
4. Нажимаем ПКМ → Reset Frame.
5. Код откатится на вход в метод, как будто вы только что в него зашли.
— Ошиблись при анализе и хотите пересмотреть состояние переменных
— Нужно повторно выполнить метод, не перезапуская весь процесс
— Дебажите рекурсию или сложные цепочки вызовов
— Reset Frame не откатывает глобальные изменения (например, изменения в базе или внешних файлах).
— Он работает только в пределах одного метода – не выйдет вернуть выполнение назад на несколько вызовов.
▪️ Как использовать Reset Frame эффективнее
Можно комбинировать его с Evaluate Expression, чтобы перед повторным вызовом метода изменять переменные вручную.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍11❤5😁1
Санкт-Петербург, 13 ноября в 19:00
Разберём архитектуру облачной записи встреч, наведём порядок в API и покажем, как простые решения спасают сервисы.
В программе:
📌 Как не упустить важное: архитектура облачной записи и конспектирования видеовстреч в Телемосте — Илья Григорьев, разработчик бэкенда Телемоста.
📌 Укрощение API: процессы и инструменты, которые действительно работают — Никита Ломакин, разработчик в команде Техплатформы.
📌 Как мы закапывали звездолёт: почему важно отстаивать простоту на архревью — Артемий Коцюбенко, разработчик протокольных сервисов Почты.
Команда Яндекс 360 работает с нагрузками >1.000.000+ RPS и создает продукты которыми пользуются 95+ млн человек каждый месяц — Диск, Почта, Телемост, Мессенджер и другие.
🍻А после докладов вас будут ждать афтепати и нетворкинг!
Регистрируйтесь по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥2
Зачем Java-разработчику тестировать логику в SQL?
Привет! Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение.
Если у тебя в проекте сложная логика в
🟢 Создаём функцию в PostgreSQL:
🔹 Проверяем прямо в базе:
✅ Это удобно, когда:
- Ты хочешь протестировать ветки логики без запуска всего приложения;
- У тебя CI/CD запускает SQL-тесты отдельно (через
- Ты хочешь быстро показать запрос аналитику или тимлиду без Java-контекста.
💡 Лайфхак: если ты используешь Liquibase/Flyway — можно держать такие функции прямо в changelog'ах как test-only objects, не влияя на runtime-приложение.
Попробуй — экономит массу времени на ревью и отладке запросов!
Подписывайся на наш канал в Max🟪
Привет! Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение.
Если у тебя в проекте сложная логика в
JOIN, CASE, оконных функциях или CTE — протестируй это на стороне базы, как обычную функцию.
CREATE OR REPLACE FUNCTION test_discount(user_id INT)
RETURNS NUMERIC AS $$
BEGIN
RETURN (
SELECT
CASE
WHEN u.vip = true THEN 0.2
ELSE 0.05
END
FROM users u WHERE u.id = user_id
);
END;
$$ LANGUAGE plpgsql;
🔹 Проверяем прямо в базе:
SELECT test_discount(101); -- вернёт 0.2 или 0.05
✅ Это удобно, когда:
- Ты хочешь протестировать ветки логики без запуска всего приложения;
- У тебя CI/CD запускает SQL-тесты отдельно (через
pgTAP, например);- Ты хочешь быстро показать запрос аналитику или тимлиду без Java-контекста.
💡 Лайфхак: если ты используешь Liquibase/Flyway — можно держать такие функции прямо в changelog'ах как test-only objects, не влияя на runtime-приложение.
Попробуй — экономит массу времени на ревью и отладке запросов!
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5🔥5⚡3
Media is too big
VIEW IN TELEGRAM
Основы gRPC
В этом видео шаг за шагом изучаем gRPC на Java:
• Пишем protobuf-схемы
• Реализуем CRUD-приложение на Spring Boot + gRPC
• Разбираем пример двунаправленной связи.
• Вы получите базовое понимание, с чего начинать работу с gRPC и как интегрировать его в Java-проекты.
🌐 🗣 СМОТРЕТЬ VKVIDEO
📺 🗣 СМОТРЕТЬ RUTUBE
🎞 🗣 СМОТРЕТЬ YOUTUBE
Подписывайся на наш канал в Max🟪
В этом видео шаг за шагом изучаем gRPC на Java:
• Пишем protobuf-схемы
• Реализуем CRUD-приложение на Spring Boot + gRPC
• Разбираем пример двунаправленной связи.
• Вы получите базовое понимание, с чего начинать работу с gRPC и как интегрировать его в Java-проекты.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍7❤1
Spring Boot — это не «новый фреймворк», а надстройка над Spring, которая убирает рутину и ускоряет разработку.
В обычном Spring нужно было вручную конфигурировать всё: от DataSource до DispatcherServlet. В Boot это делается автоматически через автоконфигурацию.
Spring Boot сканирует зависимости и classpath, а затем подключает нужные бины:
— Если у вас есть spring-boot-starter-data-jpa, Boot автоматически создаст EntityManagerFactory, DataSource, транзакционный менеджер.
— Если добавлен spring-boot-starter-web, он поднимет встроенный Tomcat/Jetty и зарегистрирует контроллеры. И так далее.
Магия кроется в аннотации @EnableAutoConfiguration (включается через @SpringBootApplication). Она загружает META-INF/spring.factories → список классов-конфигов → каждый проверяет условия @ConditionalOnClass, @ConditionalOnMissingBean и решает: активироваться или нет.
Потому что в Boot сотни готовых конфигураций «на все случаи жизни».
Фактически, это огромная библиотека «если увидишь X — настрой Y».
— Черный ящик
Легко забыть, что именно сконфигурировал Boot. Иногда приходится «копать» в автоконфигурацию, чтобы понять, какой бин реально используется.
— Избыточные зависимости
Подключив Starter, можно случайно притащить половину экосистемы Spring. Это увеличивает время старта и усложняет дебаг.
— Конфликт настроек
Собственная конфигурация может пересечься с автоконфигурацией.
⚡️ Хорошая практика
— Не доверяйте «чёрному ящику»: при старте приложения смотрите Spring Boot Actuator и логи автоконфигурации.
— Знайте про
--debug при старте: он показывает, какие автоконфигурации включены или отключены.— В продакшене лучше контролировать, какие именно стартеры вы тянете. Иногда spring-boot-starter-web приносит в проект в три раза больше, чем реально нужно.
🎯 Итог
Spring Boot — это ускоритель, но не магия. Его сила в автоконфигурациях, а слабость в том, что легко потерять контроль.
Понимание того, как работает @EnableAutoConfiguration и условия @Conditional, отличает разработчика, который «просто пишет на Boot», от того, кто реально управляет приложением.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍8🔥5
Ты уже настроил своих AI-агентов? 🤖
Приглашаем на бесплатный вебинар от OTUS «Обзор AI-технологий для разработчиков: от идей до рабочих решений»: https://vk.cc/cQXINh
Что будет, когда отладка — не ад, а код пишется в разы быстрее?
Мы покажем:
• Как встроить AI в ваш CI/CD и автоматизировать рутину
• Инструменты для генерации кода, тестов и даже документации
• Реальные кейсы использования LLM в продакшне
Спикер — Алексей Романовский, разработчик с 15-летним опытом. Он не теоретик, а практик, который уже прошел путь интеграции AI в рабочие процессы.
Важно: это открытый урок полного курса «AI для разработчиков». Места в группе тают быстрее, чем кэш при неправильной инвалидации — успевайте в группу ноября по скидке!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Приглашаем на бесплатный вебинар от OTUS «Обзор AI-технологий для разработчиков: от идей до рабочих решений»: https://vk.cc/cQXINh
Что будет, когда отладка — не ад, а код пишется в разы быстрее?
Мы покажем:
• Как встроить AI в ваш CI/CD и автоматизировать рутину
• Инструменты для генерации кода, тестов и даже документации
• Реальные кейсы использования LLM в продакшне
Спикер — Алексей Романовский, разработчик с 15-летним опытом. Он не теоретик, а практик, который уже прошел путь интеграции AI в рабочие процессы.
Важно: это открытый урок полного курса «AI для разработчиков». Места в группе тают быстрее, чем кэш при неправильной инвалидации — успевайте в группу ноября по скидке!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❤2👍2🔥1😁1
spring-context-indexerКак вы знаете, при старте Spring Boot-приложения много времени уходит на classpath scanning. Даже если вы используете
@ComponentScan, Spring всё равно перебирает кучу классов в поиске бин-кандидатов. Это рефлексивно и медленно.📌 Есть способ это оптимизировать —
spring-context-indexer.🔧 Что делать
1. Добавьте зависимость в
pom.xml:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>6.1.3</version> <!-- актуальная для Spring Boot 3 -->
<optional>true</optional>
</dependency>
2. Всё! Spring Boot на этапе компиляции сгенерирует индекс классов с аннотациями (
@Component, @Service, @Repository, и т.п.) в META-INF/spring.components.3. При старте приложения Spring сначала смотрит в индекс, а не сканирует classpath целиком.
💡 Полезно, если:
- У вас много модулей;
- Вы используете fat JAR;
- Приложение долго стартует и важна скорость.
⚠️ Важно
- Работает только с аннотациями Spring, не с кастомными;
- Не забудьте включить annotation processing в IDE (особенно в IntelliJ:
Settings → Build, Execution, Deployment → Compiler → Annotation Processors).📊 Профит: в крупных проектах - до 30–50% ускорения старта.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤5🔥2😁1
В продакшн-коде часто возникает задача ограничить доступ к методам сервиса или контроллера. Делать это вручную — значит плодить дублирование и путать бизнес-логику с проверками. Для этого в Spring Security есть аннотация @PreAuthorize.
1. Аннотация вешается на метод (контроллер или сервис).
2. При вызове метода Spring Security перехватывает обращение и проверяет условие, указанное в аннотации.
3. Условие описывается на языке SpEL (Spring Expression Language), где доступно:
Пример:
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) { ... }→ метод вызовется только для пользователей с ролью ADMIN.
— Проверка ролей и прав
hasRole('USER'), hasAnyRole('ADMIN','MODERATOR')
hasAuthority('SCOPE_read') (актуально при работе с OAuth2)— Собственные условия
@PreAuthorize("#id == authentication.principal.id")
public UserProfile getProfile(Long id) { ... }→ Здесь доступ только к своему профилю.
— Комбинации условий
Логика пишется прямо в SpEL:
@PreAuthorize("hasRole('ADMIN') or @securityService.isOwner(#docId)")
public Document update(Long docId) { ... }— Сервисы внутри выражений
В выражение можно подключать свои бины:
@PreAuthorize("@reviewSecurity.isOwner(#id, authentication)")
public Review update(Long id) { ... }→ бин reviewSecurity должен быть в контексте Spring и возвращать true/false.
— Не надо вручную писать проверки в каждом методе.
— Авторизация централизована и читается прямо на уровне API.
— Условия можно вынести в отдельный сервис, чтобы не захламлять аннотацию.
👉 В итоге @PreAuthorize — это не только про роли, а про гибкий DSL проверки доступа, который можно расширять под проект: от банальной проверки ролей до бизнес-логики уровня "пользователь может редактировать только свои документы, если они ещё не опубликованы".
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥9❤2