Перейти к основному содержимому

Вопросы интервью Spring Boot

· 13 мин. чтения

1. Обзор

С момента своего появления Spring Boot был ключевым игроком в экосистеме Spring. Этот проект делает нашу жизнь намного проще благодаря возможности автоматической настройки.

В этом руководстве мы рассмотрим некоторые из наиболее распространенных вопросов, связанных со Spring Boot, которые могут возникнуть во время собеседования.

2. Вопросы

Q1. Что такое Spring Boot и каковы его основные особенности?

Spring Boot — это, по сути, фреймворк для быстрой разработки приложений, построенный поверх Spring Framework. Благодаря автоматической настройке и поддержке встроенного сервера приложений в сочетании с обширной документацией и поддержкой сообщества Spring Boot на сегодняшний день является одной из самых популярных технологий в экосистеме Java.

Вот несколько характерных особенностей:

  • Стартеры — набор дескрипторов зависимостей для включения соответствующих зависимостей на ходу.
  • Автоконфигурация - способ автоматической настройки приложения на основе зависимостей, присутствующих в пути к классам.
  • Актуатор — для получения готовых к производству функций, таких как мониторинг
  • Безопасность
  • логирование

Q2. В чем разница между Spring и Spring Boot?

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

С годами Spring становился все более и более сложным, и количество настроек, которое требуется такому приложению, может быть пугающим. Вот где Spring Boot пригодится — он упрощает настройку приложения Spring.

По сути, в то время как Spring не имеет мнения, Spring Boot имеет свое мнение о платформе и библиотеках, позволяя нам быстро приступить к работе.

Вот два наиболее важных преимущества Spring Boot:

  • Автоматическая настройка приложений на основе артефактов, которые он находит в пути к классам.
  • Обеспечьте нефункциональные функции, общие для приложений в рабочей среде, такие как проверки безопасности или работоспособности.

Пожалуйста, ознакомьтесь с другим нашим руководством для подробного сравнения vanilla Spring и Spring Boot .

Q3. Как мы можем настроить приложение Spring Boot с помощью Maven?

Мы можем включить Spring Boot в проект Maven, как и любую другую библиотеку. Однако лучший способ — наследоваться от проекта spring-boot-starter-parent и объявить зависимости от Spring Boot starters . Это позволяет нашему проекту повторно использовать настройки Spring Boot по умолчанию.

Наследовать проект spring-boot-starter-parent очень просто — нам нужно только указать родительский элемент в pom.xml :

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0.RELEASE</version>
</parent>

Мы можем найти последнюю версию spring-boot-starter-parent на Maven Central .

Использование начального родительского проекта удобно, но не всегда возможно. Например, если наша компания требует, чтобы все проекты наследуются от стандартного POM, мы все равно можем извлечь выгоду из управления зависимостями Spring Boot с помощью пользовательского parent .

Q4. Что такое Spring Initializr?

Spring Initializr — это удобный способ создать проект Spring Boot.

Мы можем перейти на сайт Spring Initializr , выбрать инструмент управления зависимостями (Maven или Gradle), язык (Java, Kotlin или Groovy), схему упаковки (Jar или War), версию и зависимости и загрузить проект.

Это создает для нас каркас проекта и экономит время на настройку, поэтому мы можем сосредоточиться на добавлении бизнес-логики.

Даже когда мы используем мастер создания нового проекта нашей IDE (например, STS или Eclipse с плагином STS) для создания проекта Spring Boot, под капотом он использует Spring Initializr.

Q5. Какие стартеры Spring Boot доступны?

Каждый стартер играет роль универсального магазина для всех необходимых нам технологий Spring. Затем другие необходимые зависимости подключаются транзитивно и управляются согласованным образом.

Все стартеры находятся в группе org.springframework.boot , и их имена начинаются с spring-boot-starter- . Этот шаблон именования упрощает поиск стартеров, особенно при работе с IDE, которые поддерживают поиск зависимостей по имени.

На момент написания этой статьи в нашем распоряжении более 50 стартеров. Здесь мы перечислим наиболее распространенные:

  • spring-boot-starter : основной стартер, включая поддержку автоконфигурации, ведение журнала и YAML
  • spring-boot-starter-aop : для аспектно-ориентированного программирования с Spring AOP и AspectJ.
  • spring-boot-starter-data-jpa: для использования Spring Data JPA с Hibernate .
  • spring-boot-starter-security : для использования Spring Security
  • spring-boot-starter-test : для тестирования приложений Spring Boot.
  • spring-boot-starter-web : для создания веб-приложений, включая RESTful, с использованием Spring MVC.

Полный список стартеров см. в этом репозитории .

Чтобы найти дополнительную информацию о стартовых приложениях Spring Boot, ознакомьтесь со статьей Intro to Spring Boot Starters .

Q6. Как отключить конкретную автоматическую настройку?

Если мы хотим отключить конкретную автоконфигурацию, мы можем указать это с помощью атрибута exclude аннотации @EnableAutoConfiguration .

Например, этот фрагмент кода нейтрализует DataSourceAutoConfiguration :

// other annotations
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }

Если бы мы включили автоматическую настройку с помощью аннотации @SpringBootApplication , которая имеет @EnableAutoConfiguration в качестве мета-аннотации, мы могли бы отключить автоматическую настройку с помощью атрибута с тем же именем:

// other annotations
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }

Мы также можем отключить автоматическую настройку с помощью свойства среды spring.autoconfigure.exclude . Этот параметр в файле application.properties делает то же самое, что и раньше:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Q7. Как зарегистрировать пользовательскую автоконфигурацию?

Чтобы зарегистрировать класс автоконфигурации, его полное имя должно быть указано в ключе EnableAutoConfiguration в файле META-INF/spring.factories :

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.foreach.autoconfigure.CustomAutoConfiguration

Если мы собираем проект с помощью Maven, этот файл должен быть помещен в каталог resources/META-INF , который окажется в указанном месте на этапе пакета .

Q8. Как сказать автоконфигурации отступить, когда компонент существует?

Чтобы указать классу автоконфигурации отступить, когда bean-компонент уже существует, мы можем использовать аннотацию @ConditionalOnMissingBean .

Наиболее заметными атрибутами этой аннотации являются:

  • value – типы бинов для проверки
  • name – имена бинов для проверки

При размещении в методе , дополненном @Bean , целевой тип по умолчанию соответствует типу возвращаемого значения метода:

@Configuration
public class CustomConfiguration {
@Bean
@ConditionalOnMissingBean
public CustomService service() { ... }
}

Q9. Как развернуть веб-приложения Spring Boot в виде файлов Jar и War?

Традиционно мы упаковываем веб-приложение в виде файла WAR, а затем развертываем его на внешнем сервере. Это позволяет нам размещать несколько приложений на одном сервере. Когда ЦП и памяти не хватало, это был отличный способ сэкономить ресурсы.

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

Spring решает эту проблему, предоставляя подключаемый модуль, а именно spring-boot-maven-plugin , для упаковки веб-приложения в виде исполняемого файла JAR.

Чтобы включить этот плагин, просто добавьте элемент плагина в pom.xml :

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

С этим плагином мы получим толстый JAR-файл после выполнения этапа пакета . Этот JAR содержит все необходимые зависимости, включая встроенный сервер. Таким образом, нам больше не нужно беспокоиться о настройке внешнего сервера.

Затем мы можем запустить приложение так же, как обычный исполняемый файл JAR.

Обратите внимание, что элемент упаковки в файле pom.xml должен иметь значение jar для создания файла JAR:

<packaging>jar</packaging>

Если мы не включим этот элемент, по умолчанию он также будет jar .

Чтобы создать файл WAR, мы меняем элемент упаковки на war :

<packaging>war</packaging>

и оставьте зависимость контейнера от упакованного файла:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

После выполнения фазы пакета Maven у нас будет развертываемый файл WAR.

Q10. Как использовать Spring Boot для приложений командной строки?

Как и любая другая программа Java, приложение командной строки Spring Boot должно иметь метод main .

Этот метод служит точкой входа, которая вызывает метод SpringApplication#run для начальной загрузки приложения:

@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class);
// other statements
}
}

Затем класс SpringApplication запускает контейнер Spring и автоматически настраивает bean-компоненты.

Обратите внимание, что мы должны передать класс конфигурации в метод run , чтобы он работал в качестве основного источника конфигурации. По соглашению этот аргумент является самим входным классом.

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

Q11. Каковы возможные источники внешней конфигурации?

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

Затем мы можем получить доступ к этим свойствам с помощью аннотации @Value , связанного объекта с помощью аннотации @ConfigurationProperties или абстракции среды .

Q12. Что означает, что Spring Boot поддерживает расслабленное связывание?

Ослабленная привязка в Spring Boot применима к безопасной для типов привязке свойств конфигурации .

При нестрогой привязке ключ свойства не обязательно должен точно совпадать с именем свойства. Такое свойство среды может быть записано в camelCase, kebab-case, snake_case или в верхнем регистре со словами, разделенными символом подчеркивания.

Например, если свойство в классе компонента с аннотацией @ConfigurationProperties называется myProp , оно может быть привязано к любому из следующих свойств среды: myProp , my-prop , my_prop или MY_PROP .

Q13. Для чего я использую Spring Boot DevTools ? ****

Spring Boot Developer Tools или DevTools — это набор инструментов, упрощающих процесс разработки.

Чтобы включить эти функции времени разработки, нам просто нужно добавить зависимость в файл pom.xml :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>

Модуль spring-boot-devtools автоматически отключается, если приложение работает в рабочей среде. Перепаковка архивов также по умолчанию исключает этот модуль. Таким образом, это не принесет никаких накладных расходов для нашего конечного продукта.

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

Приложения, использующие DevTools, перезапускаются при каждом изменении файла в пути к классам. Это очень полезная функция при разработке, так как она дает быструю обратную связь для модификаций.

По умолчанию статические ресурсы, включая шаблоны представлений, не вызывают перезапуск. Вместо этого изменение ресурса вызывает обновление браузера. Обратите внимание, что это может произойти только в том случае, если в браузере установлено расширение LiveReload для взаимодействия со встроенным сервером LiveReload, который содержит DevTools.

Для получения дополнительной информации по этой теме см. Обзор Spring Boot DevTools .

Q14. Как писать интеграционные тесты?

При запуске интеграционных тестов для приложения Spring у нас должен быть ApplicationContext .

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

Если атрибут классов не установлен, Spring Boot ищет основной класс конфигурации. Поиск начинается с пакета, содержащего тест, пока не будет найден класс с аннотацией @SpringBootApplication или @SpringBootConfiguration .

Для получения подробных инструкций ознакомьтесь с нашим руководством по тестированию в Spring Boot .

В15 . Для чего используется привод Spring Boot?

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

Интегрировать Spring Boot Actuator в проект очень просто. Все, что нам нужно сделать, это включить стартер spring-boot-starter-actuator в файл pom.xml :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Spring Boot Actuator может предоставлять операционную информацию, используя конечные точки HTTP или JMX. Но большинство приложений используют HTTP, где идентификатор конечной точки и префикс /actuator образуют путь URL.

Вот некоторые из наиболее распространенных встроенных конечных точек, которые предоставляет Actuator:

  • env предоставляет свойства среды
  • Health показывает информацию о работоспособности приложения
  • httptrace отображает информацию о трассировке HTTP
  • info отображает произвольную информацию о приложении
  • metrics показывает информацию о метриках
  • loggers показывает и изменяет конфигурацию регистраторов в приложении
  • Mappings отображает список всех путей @RequestMapping

Пожалуйста, обратитесь к нашему руководству по Spring Boot Actuator для подробного изложения.

Q16. Что лучше настроить для проекта Spring Boot — свойства или YAML?

YAML предлагает множество преимуществ по сравнению с файлами свойств:

  • Больше ясности и лучшей читаемости
  • Идеально подходит для иерархических данных конфигурации, которые также представлены в лучшем, более читаемом формате.
  • Поддержка карт, списков и скалярных типов
  • Может включать несколько профилей в один и тот же файл (начиная с Spring Boot 2.4.0, это возможно и для файлов свойств)

Однако его написание может быть немного сложным и подверженным ошибкам из-за правил отступов.

Подробности и рабочие примеры см. в нашем учебном пособии Spring YAML vs Properties .

Q17. Какие основные аннотации предлагает Spring Boot?

Основные аннотации, которые предлагает Spring Boot, находятся в его org.springframework.boot.autoconfigure и его подпакетах.

Вот пара основных:

  • @EnableAutoConfiguration — заставить Spring Boot искать bean-компоненты автоконфигурации в своем пути к классам и автоматически применять их .
  • @SpringBootApplication — для обозначения основного класса загрузочного приложения. Эта аннотация объединяет аннотации @Configuration , @EnableAutoConfiguration и @ComponentScan с их атрибутами по умолчанию.

Spring Boot Annotations предлагает больше информации о предмете.

Q18. Как изменить порт по умолчанию в Spring Boot?

Мы можем изменить порт по умолчанию сервера, встроенного в Spring Boot , одним из следующих способов:

  • Использование файла свойств. Мы можем определить это в файле application.properties (или application.yml ), используя свойство server.port .
  • Программно — в нашем основном классе @SpringBootApplication мы можем установить server.port для экземпляра SpringApplication .
  • Использование командной строки. При запуске приложения в виде файла jar мы можем установить server.port в качестве аргумента команды java:
java -jar -Dserver.port=8081 myspringproject.jar

Q19. Какие встроенные серверы поддерживает Spring Boot и как изменить значение по умолчанию?

На сегодняшний день Spring MVC поддерживает Tomcat, Jetty и Undertow. Tomcat — это сервер приложений по умолчанию, поддерживаемый веб- стартером Spring Boot.

Spring WebFlux поддерживает Reactor Netty, Tomcat, Jetty и Undertow с Reactor Netty по умолчанию.

В Spring MVC, чтобы изменить значение по умолчанию, скажем, на Jetty, нам нужно исключить Tomcat и включить Jetty в зависимости:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

Точно так же, чтобы изменить значение по умолчанию в WebFlux на UnderTow, нам нужно исключить Reactor Netty и включить UnderTow в зависимости.

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

Q20. Зачем нам нужны профили Spring?

При разработке приложений для предприятия мы обычно имеем дело с несколькими средами, такими как Dev, QA и Prod. Свойства конфигурации для этих сред отличаются.

Например, мы можем использовать встроенную базу данных H2 для Dev, но Prod может использовать проприетарную базу данных Oracle или DB2. Даже если СУБД одинакова во всех средах, URL-адреса определенно будут разными.

Чтобы сделать это простым и понятным, Spring предоставляет профили, помогающие разделить конфигурацию для каждой среды. Таким образом, вместо того, чтобы поддерживать это программно, свойства можно хранить в отдельных файлах, таких как application-dev. свойства и приложения-прод. свойства . По умолчанию application.properties указывает на текущий активный профиль с помощью spring. профили . активен , чтобы была подобрана правильная конфигурация.

Spring Profiles дает исчерпывающее представление об этой теме.

3. Заключение

В этой статье были рассмотрены некоторые из наиболее важных вопросов о Spring Boot, которые могут возникнуть во время технического собеседования.

Мы надеемся, что они помогут найти работу мечты!