В 2023 году недостаточно просто владеть базовым языком Java. Поэтому значительная часть вопросов на собеседовании касается Spring Boot и микросервисов. Изучив эти вопросы, вы получите более глубокое представление о важнейших темах.
Как к Spring Boot-приложению подключить внешнюю базу данных, например MySQL или Oracle?
Чтобы к Spring Boot-приложению подключить внешнюю базу данных, например MySQL или Oracle, нужно выполнить следующие шаги.
1. Включение драйвера базы данных. Добавьте соответствующую зависимость драйвера базы данных для MySQL или Oracle в файл проекта “pom.xml” (Maven) или “build.gradle” (Gradle).
2. Настройте свойства подключения. В файле “application.properties” или “application.yml” укажите необходимые свойства конфигурации для подключения к базе данных. Эти свойства обычно включают URL, имя пользователя, пароль и класс драйвера для базы данных, к которой выполняется подключение.
3. Использование Spring Data JPA (опционально). Если вы планируете задействовать Spring Data JPA для работы с базой данных, включите необходимые зависимости и настройте классы сущностей, репозитории и другие параметры, связанные с JPA.
4. Создание бина DataSource. Создайте бин, определяющий конфигурацию DataSource для внешней базы данных. В этом бине задайте необходимые свойства, такие как URL, имя пользователя, пароль и класс драйвера.
5. Внедрение бина DataSource. Внедрите бин DataSource в соответствующие компоненты или репозитории, которым необходим доступ к базе данных. Для получения ссылки на DataSource можно использовать аннотации внедрения зависимостей типа “@Autowired” или механизм внедрения конструктора.
6. Выполнение операций с базой данных. После определения конфигурации и внедрения DataSource, можно использовать JDBC, JPA или другие фреймворки для выполнения операций с базой данных, выполнения запросов и взаимодействия с внешней базой данных.
Сопоставьте понятия “инверсия управления” и “внедрение зависимостей”
Инверсия управления (Inversion of Control, IoC) — это более широкий принцип проектирования, направленный на передачу контроля над созданием и управлением объектов от кода приложения к контейнеру или фреймворку. Он способствует развитию свободной связи и модульного проектирования путем делегирования ответственности за создание и управление зависимостями внешнему объекту.
Внедрение зависимостей (Dependency Injection, DI) — это специфическая реализация IoC, при которой зависимости “внедряются” в класс, а не создаются внутри него. DI — это способ реализации IoC, позволяющий предоставлять зависимости из внешних источников, например через параметры конструктора, методы-сеттеры или интерфейсы.
Что такое бин в Spring Boot?
“Бин” (“bean”) в Spring Boot — это объект Java, управляемый IoC-контейнером фреймворка Spring. Эти бины создаются, конфигурируются и управляются фреймворком Spring и обычно представляют собой компоненты или сервисы, используемые в приложении. Определяемые с помощью аннотаций или XML-конфигурации, бины автоматически соединяются между собой фреймворком Spring, что позволяет легко внедрять зависимости и создавать модульные приложения.
Опишите жизненный цикл бина
Жизненный цикл бина во фреймворке Spring состоит из нескольких ключевых фаз.
1. Инстанцирование. Создание экземпляра бина. Это может происходить с помощью конструкторов, фабричных методов или другими способами.
2. Наделение свойствами. После создания бина Spring устанавливает его свойства и зависимости.
3. Постобработка бина. Это необязательный этап, на котором можно применить пользовательскую логику пре- и пост-инициализации. Для этого реализуют интерфейсы типа “BeanPostProcessor”.
4. Инициализация. После установки свойств вызывается “init”-метод бина, если этот метод определен. Здесь можно выполнить любые задачи инициализации.
5. Использование. Теперь бин доступен для использования в приложении. Другие бины могут внедрять его, а приложение может использовать его функциональность.
6. Уничтожение. Когда контекст приложения закрывается, вызывается “destroy”-метод бина (если этот метод определен) для освобождения ресурсов и выполнения очистки.
Эти фазы представляют собой жизненный цикл бина Spring. Они позволяют контролировать и настраивать его поведение на различных этапах, таких как установка свойств, инициализация ресурсов и очистка, когда он больше не нужен.
Расскажите о типах бинов
Различают следующие типы бинов.
1. Бин-синглтон (Singleton Bean) — это единственный экземпляр бина в IoC-контейнере Spring. Он создается один раз и используется несколькими запросами или ссылками в контексте приложения.
2. Бин-прототип (Prototype Bean) — это новый экземпляр бина, создаваемый каждый раз, когда он запрашивается у IoC-контейнера Spring. Каждый запрос к бину-прототипу приводит к созданию нового экземпляра.
3. Бин запроса (Request Bean) связан с жизненным циклом HTTP-запроса в веб-приложениях. Он создается и становится доступным на время выполнения одного HTTP-запроса, после чего уничтожается.
4. Бин сессии (Session Bean) связан с жизненным циклом HTTP-сессии в веб-приложениях. Он создается при запуске новой сессии и остается активным до тех пор, пока эта сессия не станет недействительной или не закончится.
5. Бин приложения (Application Bean) связан с жизненным циклом контекста приложения Spring. Он создается при инициализации контекста приложения и уничтожается при его закрытии.
Это часто используемые типы бинов в Spring. Каждый из них имеет свой жизненный цикл и область применения, что обеспечивает гибкость в управлении экземплярами объектов в зависимости от требований приложения.
Что такое плавное завершение работы в Spring Boot?
Под плавным завершением работы в Spring Boot понимается процесс корректной (постепенной) остановки работающего приложения Spring Boot, позволяющий ему завершить текущие задачи и очистить ресурсы перед завершением работы. Таким образом, все активные запросы будут обработаны или прерваны контролируемым образом, предотвращая внезапное завершение работы.
Во время плавного завершения Spring Boot инициирует последовательность шагов для корректной остановки приложения.
1. Отклонение новых запросов. Приложение перестает принимать новые запросы, предотвращая инициализацию новых задач.
2. Ожидание завершения активных запросов. Приложение ожидает завершения обработки текущих запросов. Это позволяет ему закончить все оставшиеся задачи или операции.
3. Завершение работы компонентов. После завершения обработки всех активных запросов приложение переходит к завершению работы своих компонентов, освобождая ресурсы, закрывая соединения и выполняя необходимую очистку.
4. Уведомление внешних систем. При необходимости приложение может уведомить внешние системы, такие как реестры сервисов или балансировщики нагрузки, о том, что оно недоступно в процессе завершения работы.
Плавное завершение работы особенно важно в сценариях, когда приложению необходимо выполнить задачи очистки, освободить ресурсы или обеспечить согласованность данных. Это позволяет предотвратить потерю данных, неполное выполнение операций или неожиданное поведение приложения во время его выключения.
Для облегчения плавного завершения работы приложений Spring Boot предоставляет механизмы и хуки, такие как события “ApplicationContext”, интерфейс “SmartLifecycle” и пользовательские хуки выключения. Эти механизмы позволяют разработчикам определять пользовательское поведение и выполнять необходимые действия по очистке перед завершением работы приложения.
Остальные вопросы рассмотрим во второй части статьи.
Читайте также:
- Лучшие практики написания кода в Spring Boot
- Spring Data — сила доменных событий
- Типы операций обновления в MongoDB с использованием Spring Boot
Читайте нас в Telegram, VK и Дзен
Перевод статьи Ajay Rathod: 50+ Key Spring Boot Interview Questions for Programmers and Software Engineers in 2023