Первая часть статьи.

Что представляют собой HTTP-методы?

Вот наиболее часто используемые HTTP-методы.

1. GET: получает ресурс или данные с сервера.

2. POST: отправляет данные для обработки на сервер, что обычно приводит к созданию нового ресурса.

3. PUT: обновляет или заменяет существующий ресурс новыми данными.

4. DELETE: удаляет конкретный ресурс.

5. PATCH: частично обновляет существующий ресурс новыми данными.

6. HEAD: получает метаданные ресурса без извлечения его фактического содержимого.

7. OPTIONS: возвращает допустимые HTTP-методы и возможности сервера для данного ресурса.

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

Что такое идемпотентность? Назовите идемпотентные методы

В REST (Representational State Transfer, передача репрезентативного состояния) под идемпотентностью понимается свойство некоторых HTTP-методов, при котором повторные идентичные запросы имеют тот же эффект, что и один запрос. Другими словами, многократное выполнение идемпотентной операции приводит к тому же результату, что и однократное.

Идемпотентные методы в REST гарантируют, что даже при дублировании или повторении запроса из-за проблем в сети/поведения клиента, система останется в том же состоянии и не вызовет нежелательных побочных эффектов. Идемпотентные методы обеспечивают безопасность повторных запросов, не вызывая при этом несогласованности или неожиданного поведения.

В REST идемпотентными считаются следующие HTTP-методы.

  • GET: многократное получение ресурса не изменяет состояние сервера.
  • PUT: многократное обновление ресурса одними и теми же данными приводит к одному и тому же результату.
  • DELETE: многократное удаление ресурса приводит к одному и тому же результату.

Проектирование идемпотентных методов в RESTful API помогает обеспечить надежность, согласованность и отказоустойчивость распределенных систем, позволяя добиться надежного и предсказуемого поведения.

Что такое @Async в Spring Boot?

Аннотация @Async в Spring Boot используется для указания на то, что метод должен выполняться асинхронно. Метод, аннотированный @Async, выполняется в отдельном потоке. Это дает возможность вызывающему потоку продолжить выполнение, не дожидаясь завершения работы аннотированного метода.

Использование @Async позволяет переложить выполнение трудоемких или блокирующих операций на отдельные потоки, что повышает общую скорость реакции и производительность приложения. Данная аннотация обычно используется в сценариях, когда конкретные методы могут выполняться независимо, а их результаты не требуются вызывающему потоку немедленно.

Чтобы включить асинхронное выполнение в Spring Boot, необходимо сконфигурировать бин TaskExecutor (исполнитель задач) и аннотировать метод target с помощью @Async. Spring Boot автоматически обнаружит аннотацию @Async и выполнит аннотированный метод асинхронно с помощью указанного TaskExecutor.

В чем разница между CRUDRepository и JPARepository?

Основное различие между CrudRepository и JPARepository заключается в том, что JPARepository является расширением CRUDRepository, предоставляющим дополнительные возможности, специфичные для JPA.

Хотя оба интерфейса обеспечивают базовые операции CRUD (Create, Read, Update, Delete  —  создавать, читать, обновлять, удалять), JPARepository предлагает дополнительные возможности, такие как методы создания запросов, поддержка пагинации и возможность пересылки изменений в базу данных.

Таким образом, CRUDRepository подходит для выполнения общих CRUD-операций, а JPARepository является более функциональным и предназначен для приложений на базе JPA, предоставляя расширенные возможности по созданию запросов, помимо основных CRUD-операций.

Расскажите о starter-зависимостях Spring Boot

Starter-зависимости Spring Boot  —  это набор управляемых зависимостей, которые упрощают конфигурирование и настройку определенных функциональных возможностей или фреймворков в Spring Boot-приложении. Ниже приведены пояснения к часто используемым starter-зависимостям.

1. spring-boot-starter-web. Включает зависимости для создания веб-приложений с помощью Spring MVC, в том числе встроенный контейнер Tomcat или сервер Jetty, Spring Web и другие соответствующие компоненты.

2. spring-boot-starter-data-jpa. Предоставляет зависимости для работы с JPA (Java Persistence API  —  стандарт устойчивости Java-экосистемы), включая Hibernate, Spring Data JPA и коннекторы баз данных.

3. spring-boot-starter-security. Включает зависимости для добавления в приложение функций безопасности, таких как аутентификация, авторизация и шифрование. Интегрируется с Spring Security и предлагает дополнительные возможности (например, поддержку OAuth).

4. spring-boot-starter-test. Предоставляет зависимости для тестирования приложения, включая JUnit, Mockito и Spring Test. Это упрощает настройку модульных тестов, интеграционных тестов и других сценариев тестирования.

5. spring-boot-starter-cache. Включает зависимости для добавления возможностей кэширования в приложение. Интегрируется с такими популярными библиотеками кэширования, как Ehcache, Caffeine и Redis.

6. spring-boot-starter-amqp. Предоставляет зависимости для работы с протоколами обмена сообщениями и реализациями AMQP (Advanced Message Queuing Protocol  —  расширенный протокол организации очереди сообщений), такими как RabbitMQ.

7. spring-boot-starter-data-redis. Включает зависимости для использования Redis в качестве хранилища данных, предоставляя возможности кэширования, распределенных сессий и т. д.

Это лишь несколько примеров starter-зависимостей, доступных в Spring Boot. Каждая из них упрощает конфигурирование и настройку определенной функциональности или интеграции, позволяя разработчикам быстро включать и использовать необходимые функции в приложениях Spring Boot.

Что лучше  —  YAML-файл или Property-файл?

Это зависит от личных предпочтений и сложности конфигурации. Вот некоторые соображения.

1. Читабельность. YAML-файл обеспечивает более удобный для человека и хорошо структурированный формат, позволяющий использовать вложенные структуры данных и отступы. В Property-файлах используется простая структура пар ключ-значение.

2. Сложность. YAML-файл лучше подходит для сложных конфигураций с вложенными свойствами или массивами. Он поддерживает многострочные значения и иерархические структуры.

3. Простота. Property-файлы проще и привычнее для разработчиков, привыкших к конфигурациям типа “ключ-значение”.

4. Поддержка в Spring Boot. Spring Boot по умолчанию использует YAML-файлы для внешней конфигурации, но также поддерживает Property-файлы.

Назовите способы загрузки YAML-файла в Spring Boot

Для загрузки YAML-файла в Spring Boot можно применять следующие способы.

1. @ConfigurationProperties. Аннотируйте класс с помощью @ConfigurationProperties и укажите путь к YAML-файлу в атрибуте “value”. Spring Boot привяжет YAML-свойства к аннотированному классу.

2. @PropertySource. Используйте @PropertySource в сочетании с @Configuration для загрузки YAML-файла. Укажите местоположение YAML-файла с помощью атрибута “value”, и Spring Boot загрузит свойства в среду.

3. Файл “application.yml” или “application.yaml”. По умолчанию Spring Boot ищет в classpath файл “application.yml” или “application.yaml” и автоматически загружает его свойства в контекст приложения.

Эти методы позволяют загружать YAML-файлы и получать доступ к их свойствам в Spring Boot-приложении, обеспечивая гибкость при настройке и кастомизации поведения приложения.

Заключение

В 2023 году прочный фундамент в виде базового языка Java уже не является достаточным для разработчиков. Значительная часть вопросов на собеседованиях теперь посвящена Spring Boot и микросервисам. Тщательно изучив эти вопросы, вы не только расширите свои знания, но и подготовитесь к изучению важнейших тем в современном технологическом ландшафте.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Ajay Rathod: 50+ Key Spring Boot Interview Questions for Programmers and Software Engineers in 2023

Предыдущая статьяПервые шаги в JavaScript: создание калькулятора
Следующая статьяDALL·E 3  —  генератор изображений для продуктовых дизайнеров