❓ Вопрос
Опишите, как настроить ограничение доступа к конкретным эндпоинтам REST API с помощью аннотаций @PreAuthorize или @Secured в Spring. Приведите пример выражения для роли и дополнительные условия доступа.
✅ Ответ
Для ограничения доступа к REST API в Spring используются аннотации @PreAuthorize или @Secured, которые применяются к методам контроллеров или сервисов. @PreAuthorize позволяет задавать сложные выражения на языке SpEL, например '@PreAuthorize("hasRole('ADMIN') and #userId == authentication.principal.id")' ограничит доступ по роли и дополнительному условию. @Secured поддерживает упрощённый синтаксис с перечислением ролей, например '@Secured("ROLE_ADMIN")'. Важно, чтобы включена поддержка методной безопасности через @EnableGlobalMethodSecurity.
#lexicon #собеседование #java #junior #spring #security
Опишите, как настроить ограничение доступа к конкретным эндпоинтам REST API с помощью аннотаций @PreAuthorize или @Secured в Spring. Приведите пример выражения для роли и дополнительные условия доступа.
✅ Ответ
Для ограничения доступа к REST API в Spring используются аннотации @PreAuthorize или @Secured, которые применяются к методам контроллеров или сервисов. @PreAuthorize позволяет задавать сложные выражения на языке SpEL, например '@PreAuthorize("hasRole('ADMIN') and #userId == authentication.principal.id")' ограничит доступ по роли и дополнительному условию. @Secured поддерживает упрощённый синтаксис с перечислением ролей, например '@Secured("ROLE_ADMIN")'. Важно, чтобы включена поддержка методной безопасности через @EnableGlobalMethodSecurity.
#lexicon #собеседование #java #junior #spring #security
❓ Вопрос
Опиши, как настройка connection pool может помочь справиться с узкими местами при большом количестве одновременных запросов. Что именно ты настраиваешь и почему?
✅ Ответ
Настройка connection pool позволяет ограничить и управлять количеством одновременных подключений к базе данных, что предотвращает переполнение ресурсов и снижает время ожидания запросов. Основные параметры для настройки — это максимальное и минимальное количество соединений, время жизни соединения и время ожидания в очереди. Правильная конфигурация помогает снизить задержки при пиковых нагрузках и повысить стабильность работы приложения, обеспечивая эффективное использование закрытых ресурсов.
#lexicon #собеседование #java #senior #backend #optimization
Опиши, как настройка connection pool может помочь справиться с узкими местами при большом количестве одновременных запросов. Что именно ты настраиваешь и почему?
✅ Ответ
Настройка connection pool позволяет ограничить и управлять количеством одновременных подключений к базе данных, что предотвращает переполнение ресурсов и снижает время ожидания запросов. Основные параметры для настройки — это максимальное и минимальное количество соединений, время жизни соединения и время ожидания в очереди. Правильная конфигурация помогает снизить задержки при пиковых нагрузках и повысить стабильность работы приложения, обеспечивая эффективное использование закрытых ресурсов.
#lexicon #собеседование #java #senior #backend #optimization
❓ Вопрос
Какие типы индексов существуют в реляционных базах и в каких случаях какой тип лучше использовать?
✅ Ответ
В реляционных базах данных существуют основные типы индексов: B-деревья, хеш-индексы, и битмап-индексы. B-деревья подходят для упорядоченных данных и диапазонных запросов, обеспечивая быструю сортировку и поиск. Хеш-индексы эффективны для точного поиска по равенству, но не поддерживают диапазонные запросы. Битмап-индексы применяются для столбцов с низкой кардинальностью, где важна компактность и высокая скорость фильтрации.
#lexicon #собеседование #java #junior #core #backend #sql
Какие типы индексов существуют в реляционных базах и в каких случаях какой тип лучше использовать?
✅ Ответ
В реляционных базах данных существуют основные типы индексов: B-деревья, хеш-индексы, и битмап-индексы. B-деревья подходят для упорядоченных данных и диапазонных запросов, обеспечивая быструю сортировку и поиск. Хеш-индексы эффективны для точного поиска по равенству, но не поддерживают диапазонные запросы. Битмап-индексы применяются для столбцов с низкой кардинальностью, где важна компактность и высокая скорость фильтрации.
#lexicon #собеседование #java #junior #core #backend #sql
❓ Вопрос
Опишите пошагово, как вы настраивали интеграцию метрик трассировки с системой алертинга для своевременного обнаружения деградации и восстановления устойчивости сервиса.
✅ Ответ
Для настройки интеграции метрик трассировки с системой алертинга проводится сбор ключевых показателей производительности и ошибок из трассировочных данных. Затем определяется пороговые значения для метрик, при превышении которых должны срабатывать оповещения. Настройка алертов включает конфигурацию триггеров в системе мониторинга, которая автоматически уведомляет команду при обнаружении деградации. Также необходимо обеспечить автоматический сбор и анализ метрик для оперативного подтверждения восстановления сервиса.
#lexicon #собеседование #java #senior #backend #observability
Опишите пошагово, как вы настраивали интеграцию метрик трассировки с системой алертинга для своевременного обнаружения деградации и восстановления устойчивости сервиса.
✅ Ответ
Для настройки интеграции метрик трассировки с системой алертинга проводится сбор ключевых показателей производительности и ошибок из трассировочных данных. Затем определяется пороговые значения для метрик, при превышении которых должны срабатывать оповещения. Настройка алертов включает конфигурацию триггеров в системе мониторинга, которая автоматически уведомляет команду при обнаружении деградации. Также необходимо обеспечить автоматический сбор и анализ метрик для оперативного подтверждения восстановления сервиса.
#lexicon #собеседование #java #senior #backend #observability
❓ Вопрос
Как можно конфигурировать BeanPostProcessor для изменения поведения бина с конструкторной инъекцией и в каких сценариях это будет полезно?
✅ Ответ
BeanPostProcessor можно сконфигурировать, реализовав методы postProcessBeforeInitialization и postProcessAfterInitialization, чтобы модифицировать созданный бин или его свойства после конструкторной инъекции. Это полезно для добавления дополнительной логики, валидации или проксирования бинов без изменения их исходного кода. Особенно эффективно используется для внедрения аспектов, кэширования или динамического изменения поведения объектов на этапе инициализации.
#lexicon #собеседование #java #middle #spring #injection
Как можно конфигурировать BeanPostProcessor для изменения поведения бина с конструкторной инъекцией и в каких сценариях это будет полезно?
✅ Ответ
BeanPostProcessor можно сконфигурировать, реализовав методы postProcessBeforeInitialization и postProcessAfterInitialization, чтобы модифицировать созданный бин или его свойства после конструкторной инъекции. Это полезно для добавления дополнительной логики, валидации или проксирования бинов без изменения их исходного кода. Особенно эффективно используется для внедрения аспектов, кэширования или динамического изменения поведения объектов на этапе инициализации.
#lexicon #собеседование #java #middle #spring #injection
❓ Вопрос
Какие основные паттерны хранения данных вы используете в NoSQL базах? Опишите, как вы выбираете между key-value хранилищем и document storage в ваших проектах.
✅ Ответ
Основные паттерны хранения данных в NoSQL включают key-value, документное, колонковое и графовое хранение. При выборе между key-value и документным хранилищем учитывают структуру данных и требования к запросам: key-value подходит для простых, быстро доступных пар ключ-значение, тогда как document storage удобен для более сложных, вложенных данных с возможностью гибкого поиска по атрибутам. Важны также масштабируемость, производительность и требования к консистентности при принятии решения.
#lexicon #собеседование #java #middle #backend #storage
Какие основные паттерны хранения данных вы используете в NoSQL базах? Опишите, как вы выбираете между key-value хранилищем и document storage в ваших проектах.
✅ Ответ
Основные паттерны хранения данных в NoSQL включают key-value, документное, колонковое и графовое хранение. При выборе между key-value и документным хранилищем учитывают структуру данных и требования к запросам: key-value подходит для простых, быстро доступных пар ключ-значение, тогда как document storage удобен для более сложных, вложенных данных с возможностью гибкого поиска по атрибутам. Важны также масштабируемость, производительность и требования к консистентности при принятии решения.
#lexicon #собеседование #java #middle #backend #storage
❓ Вопрос
Объясните разницу между lazy и eager загрузкой в JPA. Какие преимущества и недостатки у каждого подхода?
✅ Ответ
Lazy загрузка откладывает извлечение связанных данных до момента их непосредственного использования, что снижает начальную нагрузку на базу и улучшает производительность при работе с большими объемами данных. Eager загрузка сразу загружает все связанные объекты, что упрощает доступ, но может привести к избыточным запросам и снижению производительности при ненужном извлечении данных. Выбор между подходами зависит от сценария использования и требований к производительности и памяти.
#lexicon #собеседование #java #junior #spring #data
Объясните разницу между lazy и eager загрузкой в JPA. Какие преимущества и недостатки у каждого подхода?
✅ Ответ
Lazy загрузка откладывает извлечение связанных данных до момента их непосредственного использования, что снижает начальную нагрузку на базу и улучшает производительность при работе с большими объемами данных. Eager загрузка сразу загружает все связанные объекты, что упрощает доступ, но может привести к избыточным запросам и снижению производительности при ненужном извлечении данных. Выбор между подходами зависит от сценария использования и требований к производительности и памяти.
#lexicon #собеседование #java #junior #spring #data
❓ Вопрос
Какие методы и статус-коды вы используете для обработки ситуаций, когда клиент делает запросы с устаревшей версией API? Опишите конкретные сценарии и ответы сервера.
✅ Ответ
Для обработки запросов на устаревших версиях API обычно применяется контроль версии через заголовки или URL. При обнаружении устаревшей версии сервер может вернуть 426 Upgrade Required или 400 Bad Request с описанием необходимости обновления. В некоторых случаях используют 301/302 редиректы на актуальную версию API. В ответах желательно указывать рекомендации по обновлению клиента и поддерживать документацию для разных версий API.
#lexicon #собеседование #java #senior #backend #http
Какие методы и статус-коды вы используете для обработки ситуаций, когда клиент делает запросы с устаревшей версией API? Опишите конкретные сценарии и ответы сервера.
✅ Ответ
Для обработки запросов на устаревших версиях API обычно применяется контроль версии через заголовки или URL. При обнаружении устаревшей версии сервер может вернуть 426 Upgrade Required или 400 Bad Request с описанием необходимости обновления. В некоторых случаях используют 301/302 редиректы на актуальную версию API. В ответах желательно указывать рекомендации по обновлению клиента и поддерживать документацию для разных версий API.
#lexicon #собеседование #java #senior #backend #http
❓ Вопрос
Как вы реализуете rate limiting на уровне backend, чтобы предотвратить перегрузку сервиса? Приведите пример конкретного подхода или инструмента и опишите шаги его внедрения.
✅ Ответ
Реализация rate limiting на уровне backend обычно включает выбор подходящего алгоритма (например, Token Bucket или Leaky Bucket) и инструмента (например, Redis для хранения состояния лимитов). Основные шаги — определить порог запросов за единицу времени, внедрить промежуточное ПО (middleware) или фильтр, который учитывает количество запросов от каждого пользователя или IP, и при превышении лимита возвращает соответствующий HTTP-статус (например, 429). Использование распределенного хранилища обеспечивает согласованность лимитов при масштабировании сервиса.
#lexicon #собеседование #java #middle #backend #scalability
Как вы реализуете rate limiting на уровне backend, чтобы предотвратить перегрузку сервиса? Приведите пример конкретного подхода или инструмента и опишите шаги его внедрения.
✅ Ответ
Реализация rate limiting на уровне backend обычно включает выбор подходящего алгоритма (например, Token Bucket или Leaky Bucket) и инструмента (например, Redis для хранения состояния лимитов). Основные шаги — определить порог запросов за единицу времени, внедрить промежуточное ПО (middleware) или фильтр, который учитывает количество запросов от каждого пользователя или IP, и при превышении лимита возвращает соответствующий HTTP-статус (например, 429). Использование распределенного хранилища обеспечивает согласованность лимитов при масштабировании сервиса.
#lexicon #собеседование #java #middle #backend #scalability
❓ Вопрос
Опишите, как вы организуете сбор и анализ метрик из production-приложения для выявления bottlenecks: какие инструменты внедряете, как дашборды и алерты помогают в ранней диагностике проблем?
✅ Ответ
Для сбора и анализа метрик из production-приложения используют инструменты мониторинга, такие как Prometheus или Grafana, которые позволяют получать данные о производительности в реальном времени. Внедряют трассировку и профилирование с помощью APM-систем (например, Elastic APM или Jaeger) для выявления узких мест и hot spots. Дашборды настраивают для визуализации ключевых метрик, а алерты — для оперативного уведомления о проблемах, что обеспечивает раннюю диагностику и своевременное реагирование на деградацию производительности.
#lexicon #собеседование #java #junior #performance
Опишите, как вы организуете сбор и анализ метрик из production-приложения для выявления bottlenecks: какие инструменты внедряете, как дашборды и алерты помогают в ранней диагностике проблем?
✅ Ответ
Для сбора и анализа метрик из production-приложения используют инструменты мониторинга, такие как Prometheus или Grafana, которые позволяют получать данные о производительности в реальном времени. Внедряют трассировку и профилирование с помощью APM-систем (например, Elastic APM или Jaeger) для выявления узких мест и hot spots. Дашборды настраивают для визуализации ключевых метрик, а алерты — для оперативного уведомления о проблемах, что обеспечивает раннюю диагностику и своевременное реагирование на деградацию производительности.
#lexicon #собеседование #java #junior #performance
❓ Вопрос
Приведите пример сценария, когда асинхронная коммуникация между сервисами может привести к проблемам целостности данных. Как бы вы решили эту проблему на практике?
✅ Ответ
Асинхронная коммуникация между сервисами может привести к рассогласованию данных, если один сервис обновляет состояние, а другой обрабатывает события с задержкой или ошибками. Такая ситуация возникает, например, при обновлении заказа и списании средств в двух разных сервисах, где сообщения могут быть доставлены некорректно или повторно. Для решения этой проблемы применяют паттерны компенсации (saga), ведут аудит событий и используют идемпотентные операции для предотвращения дублирования и потери данных.
#lexicon #собеседование #java #senior #backend #arch
Приведите пример сценария, когда асинхронная коммуникация между сервисами может привести к проблемам целостности данных. Как бы вы решили эту проблему на практике?
✅ Ответ
Асинхронная коммуникация между сервисами может привести к рассогласованию данных, если один сервис обновляет состояние, а другой обрабатывает события с задержкой или ошибками. Такая ситуация возникает, например, при обновлении заказа и списании средств в двух разных сервисах, где сообщения могут быть доставлены некорректно или повторно. Для решения этой проблемы применяют паттерны компенсации (saga), ведут аудит событий и используют идемпотентные операции для предотвращения дублирования и потери данных.
#lexicon #собеседование #java #senior #backend #arch
❓ Вопрос
Объясните, как устанавливается TCP-соединение и какие основные этапы этого процесса.
✅ Ответ
Установка TCP-соединения происходит через процесс трехстороннего рукопожатия (three-way handshake). Сначала клиент отправляет серверу SYN-пакет для инициации соединения, сервер отвечает SYN-ACK пакетом, подтверждая получение и готовность, затем клиент отправляет ACK-пакет для подтверждения. Этот механизм обеспечивает согласование параметров соединения и синхронизацию номеров последовательности перед передачей данных.
#lexicon #собеседование #java #junior #backend #networking
Объясните, как устанавливается TCP-соединение и какие основные этапы этого процесса.
✅ Ответ
Установка TCP-соединения происходит через процесс трехстороннего рукопожатия (three-way handshake). Сначала клиент отправляет серверу SYN-пакет для инициации соединения, сервер отвечает SYN-ACK пакетом, подтверждая получение и готовность, затем клиент отправляет ACK-пакет для подтверждения. Этот механизм обеспечивает согласование параметров соединения и синхронизацию номеров последовательности перед передачей данных.
#lexicon #собеседование #java #junior #backend #networking
❓ Вопрос
Опишите пошагово, как внедрить в event-driven систему механизм дедлайнов (TTL) для сообщений, чтобы избежать обработки устаревших событий. Какие настройки используете в Kafka или RabbitMQ для этого?
✅ Ответ
Для реализации механизма TTL в event-driven системе необходимо ограничить время жизни сообщений, чтобы устаревшие события не обрабатывались. В RabbitMQ можно использовать свойство TTL на уровне очереди или отдельных сообщений, задавая параметр x-message-ttl или x-expires, после чего сообщения автоматически удаляются. В Kafka можно настроить retention.ms для топиков, что определит время хранения сообщений на брокере, после которого они становятся недоступны для потребителей. Важно также корректно обрабатывать время жизни сообщений на уровне потребителей, проверяя timestamp и игнорируя старые события при необходимости.
#lexicon #собеседование #java #middle #backend #messaging
Опишите пошагово, как внедрить в event-driven систему механизм дедлайнов (TTL) для сообщений, чтобы избежать обработки устаревших событий. Какие настройки используете в Kafka или RabbitMQ для этого?
✅ Ответ
Для реализации механизма TTL в event-driven системе необходимо ограничить время жизни сообщений, чтобы устаревшие события не обрабатывались. В RabbitMQ можно использовать свойство TTL на уровне очереди или отдельных сообщений, задавая параметр x-message-ttl или x-expires, после чего сообщения автоматически удаляются. В Kafka можно настроить retention.ms для топиков, что определит время хранения сообщений на брокере, после которого они становятся недоступны для потребителей. Важно также корректно обрабатывать время жизни сообщений на уровне потребителей, проверяя timestamp и игнорируя старые события при необходимости.
#lexicon #собеседование #java #middle #backend #messaging
❓ Вопрос
Какие проблемы могут возникнуть при переопределении equals() и hashCode() в классах с генериками и как вы их решаете на практике?
✅ Ответ
При переопределении equals() и hashCode() в классах с дженериками важно учитывать, что тип параметра во время выполнения подвергается стиранию, поэтому нельзя полагаться на конкретные типы. Также в реализации нужно применять меры для предотвращения ошибок при сравнении null и обеспечивать согласованность между equals() и hashCode(). Практически используют сравнение полей, значимых для идентичности объекта, с учетом возможных null, и включают все эти поля в формирование хэш-кода, часто с помощью встроенных утилит, таких как Objects.equals() и Objects.hash().
#lexicon #собеседование #java #senior #fundamentals
Какие проблемы могут возникнуть при переопределении equals() и hashCode() в классах с генериками и как вы их решаете на практике?
✅ Ответ
При переопределении equals() и hashCode() в классах с дженериками важно учитывать, что тип параметра во время выполнения подвергается стиранию, поэтому нельзя полагаться на конкретные типы. Также в реализации нужно применять меры для предотвращения ошибок при сравнении null и обеспечивать согласованность между equals() и hashCode(). Практически используют сравнение полей, значимых для идентичности объекта, с учетом возможных null, и включают все эти поля в формирование хэш-кода, часто с помощью встроенных утилит, таких как Objects.equals() и Objects.hash().
#lexicon #собеседование #java #senior #fundamentals
❓ Вопрос
Какие паттерны асинхронного программирования вы используете для эффективного управления потоками и как они помогают избежать проблем с блокировками и конкуренцией?
✅ Ответ
Для эффективного управления потоками применяются паттерны, такие как ExecutorService для управления пулом потоков, Future и CompletableFuture для обработки асинхронных задач с возможностью композиции, а также паттерн Producer-Consumer для разделения задач на производящие и потребляющие. Эти паттерны помогают избежать блокировок благодаря ограничению количества одновременно выполняемых потоков и асинхронному ожиданию результатов без удержания ресурсов. Использование неблокирующих структур данных и механизмов синхронизации снижает риск условий гонки и конкуренции.
#lexicon #собеседование #java #senior #asynchronous
Какие паттерны асинхронного программирования вы используете для эффективного управления потоками и как они помогают избежать проблем с блокировками и конкуренцией?
✅ Ответ
Для эффективного управления потоками применяются паттерны, такие как ExecutorService для управления пулом потоков, Future и CompletableFuture для обработки асинхронных задач с возможностью композиции, а также паттерн Producer-Consumer для разделения задач на производящие и потребляющие. Эти паттерны помогают избежать блокировок благодаря ограничению количества одновременно выполняемых потоков и асинхронному ожиданию результатов без удержания ресурсов. Использование неблокирующих структур данных и механизмов синхронизации снижает риск условий гонки и конкуренции.
#lexicon #собеседование #java #senior #asynchronous
❓ Вопрос
Какие HTTP-заголовки рекомендуете использовать для защиты API при аутентификации и авторизации, и как их правильно настраивать на сервере?
✅ Ответ
Для защиты API при аутентификации и авторизации обычно используются заголовки Authorization с токенами типа Bearer, содержащими JWT или другие схемы аутентификации. Важно правильно настроить CORS-заголовки (Access-Control-Allow-Origin, Access-Control-Allow-Headers) для контроля доступа из браузера. Также стоит применять заголовки безопасности, такие как Strict-Transport-Security для принудительного использования HTTPS и Content-Security-Policy для ограничения источников контента. На сервере необходимо валидировать и парсить заголовки, обеспечивая корректную проверку полномочий и защиту от подделки запросов.
#lexicon #собеседование #java #junior #backend #security
Какие HTTP-заголовки рекомендуете использовать для защиты API при аутентификации и авторизации, и как их правильно настраивать на сервере?
✅ Ответ
Для защиты API при аутентификации и авторизации обычно используются заголовки Authorization с токенами типа Bearer, содержащими JWT или другие схемы аутентификации. Важно правильно настроить CORS-заголовки (Access-Control-Allow-Origin, Access-Control-Allow-Headers) для контроля доступа из браузера. Также стоит применять заголовки безопасности, такие как Strict-Transport-Security для принудительного использования HTTPS и Content-Security-Policy для ограничения источников контента. На сервере необходимо валидировать и парсить заголовки, обеспечивая корректную проверку полномочий и защиту от подделки запросов.
#lexicon #собеседование #java #junior #backend #security
❓ Вопрос
Как организовать мониторинг и логирование в распределённой системе микросервисов? Какие конкретные технологии или подходы вы используете для обнаружения и локализации проблем?
✅ Ответ
Мониторинг в распределённой системе строится на сборе метрик, логов и трассировок с каждого микросервиса для контроля состояния и быстрого выявления аномалий. Применяется централизованное логирование с помощью систем, таких как ELK Stack или Loki, а для трассировки запросов через сервисы используются инструменты OpenTelemetry или Jaeger. Для оповещений на основе мониторинга метрик применяют Prometheus и Alertmanager. Важно обеспечить корреляцию логов и метрик по общим идентификаторам запросов для эффективной диагностики и локализации проблем.
#lexicon #собеседование #java #middle #backend #arch
Как организовать мониторинг и логирование в распределённой системе микросервисов? Какие конкретные технологии или подходы вы используете для обнаружения и локализации проблем?
✅ Ответ
Мониторинг в распределённой системе строится на сборе метрик, логов и трассировок с каждого микросервиса для контроля состояния и быстрого выявления аномалий. Применяется централизованное логирование с помощью систем, таких как ELK Stack или Loki, а для трассировки запросов через сервисы используются инструменты OpenTelemetry или Jaeger. Для оповещений на основе мониторинга метрик применяют Prometheus и Alertmanager. Важно обеспечить корреляцию логов и метрик по общим идентификаторам запросов для эффективной диагностики и локализации проблем.
#lexicon #собеседование #java #middle #backend #arch
❓ Вопрос
Какие есть стратегии маршрутизации сообщений в RabbitMQ? Приведите примеры использования различных типов обменников (exchange) для реализации этих стратегий.
✅ Ответ
Стратегии маршрутизации сообщений в RabbitMQ реализуются через различные типы обменников: direct, fanout, topic и headers. Direct обменник отправляет сообщение в очередь, совпадающую с точным routing key; fanout рассылает сообщение во все привязанные очереди, реализуя широковещательную рассылку. Topic обменник позволяет направлять сообщения согласно шаблонам routing key, что удобно для гибкой фильтрации, а headers маршрутизирует сообщения по значениям заголовков. Выбор типа обменника зависит от бизнес-логики: direct для точечных сообщений, fanout для уведомлений всем подписчикам, topic для тематической маршрутизации и headers для сложных условий.
#lexicon #собеседование #java #middle #backend #messaging
Какие есть стратегии маршрутизации сообщений в RabbitMQ? Приведите примеры использования различных типов обменников (exchange) для реализации этих стратегий.
✅ Ответ
Стратегии маршрутизации сообщений в RabbitMQ реализуются через различные типы обменников: direct, fanout, topic и headers. Direct обменник отправляет сообщение в очередь, совпадающую с точным routing key; fanout рассылает сообщение во все привязанные очереди, реализуя широковещательную рассылку. Topic обменник позволяет направлять сообщения согласно шаблонам routing key, что удобно для гибкой фильтрации, а headers маршрутизирует сообщения по значениям заголовков. Выбор типа обменника зависит от бизнес-логики: direct для точечных сообщений, fanout для уведомлений всем подписчикам, topic для тематической маршрутизации и headers для сложных условий.
#lexicon #собеседование #java #middle #backend #messaging
❓ Вопрос
Какие потенциальные проблемы могут возникнуть при использовании raw types в Java и как этого избежать с помощью generics? Приведите пример кода и объясните.
✅ Ответ
Использование raw types в Java приводит к потере типовой безопасности, что может вызвать ClassCastException во время выполнения. Generics позволяют определять типы параметров, обеспечивая проверку типов на этапе компиляции и исключая необходимость ручных кастов. Например, List<String> гарантирует, что список содержит только строки, тогда как List без параметров может содержать любые объекты, приводя к ошибкам. Чтобы избежать проблем с raw types, рекомендуется всегда использовать параметризованные типы и избегать необобщённых коллекций.
#lexicon #собеседование #java #senior #fundamentals
Какие потенциальные проблемы могут возникнуть при использовании raw types в Java и как этого избежать с помощью generics? Приведите пример кода и объясните.
✅ Ответ
Использование raw types в Java приводит к потере типовой безопасности, что может вызвать ClassCastException во время выполнения. Generics позволяют определять типы параметров, обеспечивая проверку типов на этапе компиляции и исключая необходимость ручных кастов. Например, List<String> гарантирует, что список содержит только строки, тогда как List без параметров может содержать любые объекты, приводя к ошибкам. Чтобы избежать проблем с raw types, рекомендуется всегда использовать параметризованные типы и избегать необобщённых коллекций.
#lexicon #собеседование #java #senior #fundamentals
❓ Вопрос
Какое поведение и жизненный цикл у Spring-бина с областью видимости singleton? Приведите пример, когда это предпочтительно.
✅ Ответ
Spring-бин с областью видимости singleton создаётся один раз при старте контейнера и существует в течение всего времени жизни приложения. Все запросы к такому бину возвращают одну и ту же инстанцию, что обеспечивает экономию ресурсов и состояние, если оно требуется. Такой scope подходит для безсостоянийных сервисов или компонентов, где общий доступ к ресурсам безопасен и желателен. Например, бины-сервисы, реализующие логику бизнес-процессов, часто объявляют singleton для повышения производительности.
#lexicon #собеседование #java #junior #spring #injection
Какое поведение и жизненный цикл у Spring-бина с областью видимости singleton? Приведите пример, когда это предпочтительно.
✅ Ответ
Spring-бин с областью видимости singleton создаётся один раз при старте контейнера и существует в течение всего времени жизни приложения. Все запросы к такому бину возвращают одну и ту же инстанцию, что обеспечивает экономию ресурсов и состояние, если оно требуется. Такой scope подходит для безсостоянийных сервисов или компонентов, где общий доступ к ресурсам безопасен и желателен. Например, бины-сервисы, реализующие логику бизнес-процессов, часто объявляют singleton для повышения производительности.
#lexicon #собеседование #java #junior #spring #injection