Что такое BeanPostProcessor в Java Spring Boot?
Это интерфейс, который позволяет вмешиваться в процесс создания и инициализации бинов в Spring-контейнере.
Он предоставляет два основных метода, которые вызываются на разных этапах жизненного цикла бина:
1.
Вызывается до инициализации бина (до вызова метода с
2.
Вызывается после инициализации бина (после того, как все методы инициализации завершились).
Зачем нужен BeanPostProcessor?
Он используется для дополнительной обработки и кастомизации бинов после их создания, но до того, как они будут переданы клиентскому коду.
Примеры:
- Добавление проксирования бинов (например, для AOP или транзакций)
- Валидация или изменение свойств бина
- Логирование жизненного цикла
- Добавление кастомных аннотаций
- Обработка marker-интерфейсов
Как это работает?
1. Spring сканирует контекст на наличие бинов, которые реализуют интерфейс
2. Если такие бины найдены, они применяются ко всем бинам в приложении.
3. Методы
👉 Java Portal
Это интерфейс, который позволяет вмешиваться в процесс создания и инициализации бинов в Spring-контейнере.
Он предоставляет два основных метода, которые вызываются на разных этапах жизненного цикла бина:
1.
postProcessBeforeInitialization(Object bean, String beanName)Вызывается до инициализации бина (до вызова метода с
@PostConstruct или InitializingBean#afterPropertiesSet).2.
postProcessAfterInitialization(Object bean, String beanName)Вызывается после инициализации бина (после того, как все методы инициализации завершились).
Зачем нужен BeanPostProcessor?
Он используется для дополнительной обработки и кастомизации бинов после их создания, но до того, как они будут переданы клиентскому коду.
Примеры:
- Добавление проксирования бинов (например, для AOP или транзакций)
- Валидация или изменение свойств бина
- Логирование жизненного цикла
- Добавление кастомных аннотаций
- Обработка marker-интерфейсов
Как это работает?
1. Spring сканирует контекст на наличие бинов, которые реализуют интерфейс
BeanPostProcessor.2. Если такие бины найдены, они применяются ко всем бинам в приложении.
3. Методы
postProcessBeforeInitialization и postProcessAfterInitialization вызываются для каждого бина, который создаёт Spring.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Java-совет: начиная с Java 9 можно использовать
👉 Java Portal
Stream.takeWhile() для удобной "нарезки" списков через стримы.List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
✗ Вместо:
List<Integer> result = new ArrayList<>();
for (Integer n : numbers) {
if (n < 5) {
result.add(n);
} else {
break;
}
}
System.out.println(result); // [1, 2, 3, 4]
✓ Можно так:
result = numbers.stream().takeWhile(n -> n < 5).toList();
System.out.println(result); // [1, 2, 3, 4]
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥3
Я побывал по обе стороны собеседований по system design.
Ниже темы, которые нужно изучить, чтобы действительно хорошо в этом разбираться:
1. [Сервер]
2. [Задержка и пропускная способность]
3. [Масштабирование и его виды]
– Вертикальное и горизонтальное масштабирование
4. [Автомасштабирование]
5. [Прикидочные расчеты]
6. [Теорема CAP]
7. [Масштабирование базы данных]
– Индексы
– Партиционирование
– Архитектура master-slave
– Multi-master
– Шардирование базы данных
– Недостатки шардирования
8. [SQL и NoSQL базы данных и когда что использовать]
9. [База данных]
– SQL-база данных
– NoSQL-база данных
– Масштабирование в NoSQL и SQL
– Когда какую базу использовать?
10. [Микросервисы]
– Монолит vs микросервисы
– Зачем вообще разбивать приложение на микросервисы?
– Когда использовать микросервисы?
– Как клиенты делают запросы в микросервисной архитектуре?
11. [Глубокое погружение в load balancer]
– Зачем нужен load balancer?
– Алгоритмы load balancing
12. [Кеширование]
– Плюсы кеширования
– Типы кешей
– Redis
13. [Blob Storage]
– Что такое blob и зачем нужно blob storage?
– AWS S3
14. [CDN, Content Delivery Network]
– Как работает CDN?
15. [Message Broker]
– Асинхронное программирование
– Зачем ставить message broker между сервисами?
– Очередь сообщений
– Поток сообщений
– Когда использовать message broker
16. [Глубокое погружение в Apache Kafka]
– Когда использовать Kafka
– Внутреннее устройство Kafka
17. [Pub/sub в реальном времени]
18. [Event-Driven Architecture]
– Зачем использовать EDA?
– Простое уведомление о событии
– Передача состояния через событие
19. [Распределенные системы]
20. [Самовосстанавливающаяся система с election лидера]
21. [Глубокое погружение в consistency]
– Строгая согласованность
– Когда выбирать strong consistency
– Eventual consistency
– Когда выбирать eventual consistency
– Способы добиться strong consistency
– Способы добиться eventual consistency
22. [Consistent hashing]
23. [Избыточность данных и восстановление данных]
– Зачем делать базы данных избыточными?
– Разные способы резервного копирования
– Непрерывная избыточность
24. [Прокси]
– Forward proxy vs reverse proxy
👉 Java Portal
Ниже темы, которые нужно изучить, чтобы действительно хорошо в этом разбираться:
1. [Сервер]
2. [Задержка и пропускная способность]
3. [Масштабирование и его виды]
– Вертикальное и горизонтальное масштабирование
4. [Автомасштабирование]
5. [Прикидочные расчеты]
6. [Теорема CAP]
7. [Масштабирование базы данных]
– Индексы
– Партиционирование
– Архитектура master-slave
– Multi-master
– Шардирование базы данных
– Недостатки шардирования
8. [SQL и NoSQL базы данных и когда что использовать]
9. [База данных]
– SQL-база данных
– NoSQL-база данных
– Масштабирование в NoSQL и SQL
– Когда какую базу использовать?
10. [Микросервисы]
– Монолит vs микросервисы
– Зачем вообще разбивать приложение на микросервисы?
– Когда использовать микросервисы?
– Как клиенты делают запросы в микросервисной архитектуре?
11. [Глубокое погружение в load balancer]
– Зачем нужен load balancer?
– Алгоритмы load balancing
12. [Кеширование]
– Плюсы кеширования
– Типы кешей
– Redis
13. [Blob Storage]
– Что такое blob и зачем нужно blob storage?
– AWS S3
14. [CDN, Content Delivery Network]
– Как работает CDN?
15. [Message Broker]
– Асинхронное программирование
– Зачем ставить message broker между сервисами?
– Очередь сообщений
– Поток сообщений
– Когда использовать message broker
16. [Глубокое погружение в Apache Kafka]
– Когда использовать Kafka
– Внутреннее устройство Kafka
17. [Pub/sub в реальном времени]
18. [Event-Driven Architecture]
– Зачем использовать EDA?
– Простое уведомление о событии
– Передача состояния через событие
19. [Распределенные системы]
20. [Самовосстанавливающаяся система с election лидера]
21. [Глубокое погружение в consistency]
– Строгая согласованность
– Когда выбирать strong consistency
– Eventual consistency
– Когда выбирать eventual consistency
– Способы добиться strong consistency
– Способы добиться eventual consistency
22. [Consistent hashing]
23. [Избыточность данных и восстановление данных]
– Зачем делать базы данных избыточными?
– Разные способы резервного копирования
– Непрерывная избыточность
24. [Прокси]
– Forward proxy vs reverse proxy
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
Совет по Spring Boot: ускорить приложение можно с помощью
🟢 Позволяет избежать повторных вызовов к БД и API
🟢 Снижает задержки
🟢 По умолчанию Spring использует in-memory map, но в проде можно подключить внешний провайдер кеша
👉 Java Portal
@EnableCaching и @Cacheable.Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
API Gateway, если по-человечески:
Клиент не должен ходить в 6 разных сервисов.
Он должен ходить в одну точку.
Gateway стоит перед всей системой и берёт на себя:
- маршрутизацию входящих запросов в нужный сервис
- валидацию токенов, например JWT и OAuth, ещё до того, как запрос вообще дойдёт до сервисов
- rate limiting, чтобы API не абьюзили
- логирование, чтобы наблюдаемость была в одном месте
- балансировку нагрузки между инстансами сервисов
Без gateway каждый сервис заново городит у себя аутентификацию, логирование и rate limiting.
С gateway всё это решается один раз, централизованно.
Вот и вся суть: одна точка входа и единый слой контроля.
👉 Java Portal
Клиент не должен ходить в 6 разных сервисов.
Он должен ходить в одну точку.
Gateway стоит перед всей системой и берёт на себя:
- маршрутизацию входящих запросов в нужный сервис
- валидацию токенов, например JWT и OAuth, ещё до того, как запрос вообще дойдёт до сервисов
- rate limiting, чтобы API не абьюзили
- логирование, чтобы наблюдаемость была в одном месте
- балансировку нагрузки между инстансами сервисов
Без gateway каждый сервис заново городит у себя аутентификацию, логирование и rate limiting.
С gateway всё это решается один раз, централизованно.
Вот и вся суть: одна точка входа и единый слой контроля.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3
Не используйте
Использование
Когда используется
Вот наивный пример:
В этом запросе каждая строка, которая не удовлетворяет условию, превращается в
Лучше всего вообще убрать
В этой версии строки, не подходящие под условие, возвращают
👉 Java Portal
ELSE 0 вместе с COUNT и CASEИспользование
ELSE 0 - очень частая ошибка у новичков, когда они комбинируют функцию COUNT с выражением CASE. Обычно это происходит из-за непонимания того, как именно COUNT работает при применении к столбцу.Когда используется
COUNT(column), функция считает все значения, которые не равны NULL, включая нули. Это значит, что если в выражении CASE указан ELSE 0, каждая строка, не попавшая под условие, превращается в значение 0. В результате такие строки тоже попадают в подсчёт.Вот наивный пример:
sql id="g4suvd"
SELECT
Department,
COUNT(CASE
WHEN Status = 'Active' THEN EmployeeID
ELSE 0
END) AS ActiveEmployees
FROM Employees
GROUP BY Department;
В этом запросе каждая строка, которая не удовлетворяет условию, превращается в
0, а это валидное значение, поэтому оно тоже учитывается в COUNT. Из-за этого результат может получиться вводящим в заблуждение.Лучше всего вообще убрать
ELSE. Когда ветка ELSE опущена, выражение CASE возвращает NULL для строк, которые не соответствуют условию. А так как COUNT() игнорирует NULL, будут посчитаны только строки, которые действительно удовлетворяют условию. Вот правильный вариант:sql id="vxa5np"
SELECT
Department,
COUNT(CASE
WHEN Status = 'Active' THEN EmployeeID
END) AS ActiveEmployees
FROM Employees
GROUP BY Department;
В этой версии строки, не подходящие под условие, возвращают
NULL, и COUNT() естественным образом исключает их из подсчёта. В итоге запрос получается чище, а подсчёт корректно отражает только те значения, которые реально соответствуют условию.Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
Java tip: используйте
Значение создается лениво
👉 Java Portal
ThreadLocal.withInitial(...), чтобы у каждого потока было свое безопасное значение по умолчанию.Значение создается лениво
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4
Вопрос на Java-собеседовании:
Что такое Spring Bean Scope?
Основные типы:
- singleton (по умолчанию) — один экземпляр на весь контейнер.
- prototype — новый экземпляр для каждого запроса.
- request — бин живет в рамках одного HTTP-запроса.
- session — бин живет в рамках одной HTTP-сессии.
- application — бин живет в рамках всего веб-приложения.
- websocket — бин живет на протяжении сессии WebSocket.
👉 Java Portal
Что такое Spring Bean Scope?
Spring Bean Scope определяет жизненный цикл и область видимости бина в контейнере.Основные типы:
- singleton (по умолчанию) — один экземпляр на весь контейнер.
- prototype — новый экземпляр для каждого запроса.
- request — бин живет в рамках одного HTTP-запроса.
- session — бин живет в рамках одной HTTP-сессии.
- application — бин живет в рамках всего веб-приложения.
- websocket — бин живет на протяжении сессии WebSocket.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
🔥 Подписка на easyoffer PRO на 1 год со скидкой 70%
easyoffer – сайт для подготовки к собеседованию на программиста, тестировщика и другие IT-профессии становится еще доступнее со скидкой 70% до 10 марта.
⚙️ Актуальные функции:
1. База вопросов из реальных технических собеседований с вероятностью встречи и примерами ответов.
2. База задач с этапа live-coding.
3. База видеозаписей 1100+ реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.) на позиции Junior/Middle/Senior.
4. База 400+ тестовых заданий от компаний.
5. Аналитика ТОП-требований из вакансий для лучшего написания резюме по ключевым словам.
6. Тренажеры для подготовки к собеседованию. В том числе тренажер «Реальное собеседование» со сценарием вопросов под конкретную компанию.
Акция до 10 марта (включительно) на PRO-тариф.
– Подписка действует 1 год
– Доступ ко всем профессиями сразу
👉 Смотри подробности тарифа и покупай на easyoffer
easyoffer – сайт для подготовки к собеседованию на программиста, тестировщика и другие IT-профессии становится еще доступнее со скидкой 70% до 10 марта.
⚙️ Актуальные функции:
1. База вопросов из реальных технических собеседований с вероятностью встречи и примерами ответов.
2. База задач с этапа live-coding.
3. База видеозаписей 1100+ реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.) на позиции Junior/Middle/Senior.
4. База 400+ тестовых заданий от компаний.
5. Аналитика ТОП-требований из вакансий для лучшего написания резюме по ключевым словам.
6. Тренажеры для подготовки к собеседованию. В том числе тренажер «Реальное собеседование» со сценарием вопросов под конкретную компанию.
Акция до 10 марта (включительно) на PRO-тариф.
– Подписка действует 1 год
– Доступ ко всем профессиями сразу
👉 Смотри подробности тарифа и покупай на easyoffer
Гайд для новичков по созданию HTTP-сервера с нуля.
Хочешь своими руками написать HTTP-сервер и потом отправлять на него запросы и получать ответы?
Если да, вот как раз гайд, по которому можно пройтись.
Что нужно знать заранее
Нужно знать Java.
Если не знаешь, не страшно: шаги из гайда можно перенести почти на любой язык, с которым тебе удобно работать, просто используя семантически эквивалентные конструкции в коде.
Базовое понимание программирования и OOP.
Текстовый редактор и, возможно, много кофе. Как пойдет.🤭
👉 Java Portal
Хочешь своими руками написать HTTP-сервер и потом отправлять на него запросы и получать ответы?
Если да, вот как раз гайд, по которому можно пройтись.
Что нужно знать заранее
Нужно знать Java.
Если не знаешь, не страшно: шаги из гайда можно перенести почти на любой язык, с которым тебе удобно работать, просто используя семантически эквивалентные конструкции в коде.
Примечание: JS/TS для этого гайда я бы не рекомендовал.
Базовое понимание программирования и OOP.
Текстовый редактор и, возможно, много кофе. Как пойдет.
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java:
👉 Java Portal
List.reversed() возвращает неизменяемое (unmodifiable) представление исходного списка в обратном порядке.Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
В заповедной Карелии, среди сотен озёр и густой северной тайги, на берегу Онежского озера расположился бутик-отель «Заонежье». Здесь архитектура деликатно вписана в ландшафт: фасады из северного дерева и лемех, вырубленный вручную, перекликаются с традициями древнего зодчества Русского Севера. Каждое окно обращено к воде, позволяя бесконечному озёрному горизонту стать частью интерьера.
Тринадцать видовых номеров и четыре гостевых дома с дровяными каминами создают атмосферу приватности и спокойствия, а ресторан «Руна» предлагает авторскую гастрономию из локальных продуктов — от свежевыловленной рыбы до дичи и северных ягод. Пространство отеля продумано для размеренного отдыха: пирс, панорамный зал, экотропы и уединённые места для медитации среди леса.
Заонежье — край редкого шунгита, чистейшей воды и нетронутых лесов, где можно встретить орлана-белохвоста и увидеть северное сияние. Гостям доступны экспедиции на снегоходах и катерах, путешествия к острову Кижи, рыбалка, прогулки на каяках, сапах и тишина безкрайних пейзажей.
Здесь легко устроить digital detox или, напротив, провести частное гастрономическое событие у костра на берегу озера. Баня по-чёрному в соседней деревне, чаепитие из самовара, пикники на необитаемых островах.
«Заонежье» — это не просто отдых, а глубокое погружение в первозданную природу, где комфорт и культура соединяются с силой земли и воды.
Наш телеграм канал: @hotelzaonezhie
Забронировать номер: https://zaonezhie.com
Тринадцать видовых номеров и четыре гостевых дома с дровяными каминами создают атмосферу приватности и спокойствия, а ресторан «Руна» предлагает авторскую гастрономию из локальных продуктов — от свежевыловленной рыбы до дичи и северных ягод. Пространство отеля продумано для размеренного отдыха: пирс, панорамный зал, экотропы и уединённые места для медитации среди леса.
Заонежье — край редкого шунгита, чистейшей воды и нетронутых лесов, где можно встретить орлана-белохвоста и увидеть северное сияние. Гостям доступны экспедиции на снегоходах и катерах, путешествия к острову Кижи, рыбалка, прогулки на каяках, сапах и тишина безкрайних пейзажей.
Здесь легко устроить digital detox или, напротив, провести частное гастрономическое событие у костра на берегу озера. Баня по-чёрному в соседней деревне, чаепитие из самовара, пикники на необитаемых островах.
«Заонежье» — это не просто отдых, а глубокое погружение в первозданную природу, где комфорт и культура соединяются с силой земли и воды.
Наш телеграм канал: @hotelzaonezhie
Забронировать номер: https://zaonezhie.com
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2