Запитання про інтерв’ю весняного завантаження

1. Вступ

З моменту свого появи Spring Boot був ключовим гравцем в екосистемі Spring. Цей проект значно полегшує наше життя завдяки своїм можливостям автоконфігурації.

У цьому підручнику ми розглянемо деякі найпоширеніші питання, пов’язані з Spring Boot, які можуть виникнути під час співбесіди.

2. Питання

Q1. Що таке Spring Boot і які його основні особливості?

Spring Boot - це, по суті, фреймворк для швидкої розробки додатків, побудований поверх Spring Framework. Завдяки своїй автоматичній конфігурації та підтримці вбудованого сервера додатків, у поєднанні з великою документацією та підтримкою спільноти, Spring Boot є однією з найпопулярніших технологій в екосистемі Java на сьогодні.

Ось кілька основних особливостей:

  • Початкові засоби - набір дескрипторів залежностей, які включають відповідні залежності на ходу
  • Автоконфігурація - спосіб автоматичного налаштування програми на основі залежностей, наявних на шляху до класу
  • Привід - для отримання готових до виробництва функцій, таких як моніторинг
  • Безпека
  • Лісозаготівля

Q2. Які відмінності між весною та весняним завантаженням?

Spring Framework надає безліч функцій, які полегшують розробку веб-додатків. Ці функції включають ін’єкцію залежностей, прив’язку даних, програмування за аспектом, доступ до даних та багато іншого.

З роками Spring стає дедалі складнішим, і кількість конфігурації, яку вимагає такий додаток, може лякати. Ось тут Spring Boot стане в нагоді - це робить налаштування програми Spring легким.

По суті, хоча Spring не є вільним, Spring Boot сприймає впевнений погляд на платформу та бібліотеки, дозволяючи нам швидко розпочати роботу.

Ось дві найважливіші переваги, які приносить Spring Boot:

  • Автоконфігуруйте програми на основі артефактів, які він знаходить на шляху до класу
  • Надайте нефункціональні функції, загальні для виробничих додатків, такі як перевірка безпеки та працездатності

Будь ласка, ознайомтесь з одним з наших інших підручників для детального порівняння між ванільним пружиною та весняним завантаженням.

Q3. Як ми можемо створити програму Spring Boot із Maven?

Ми можемо включити Spring Boot у проект Maven, як і будь-яку іншу бібліотеку. Однак найкращий спосіб - це успадкування від батьківського проекту spring-boot-starter-батьків і оголошення оголошень про залежності для початківців Spring Boot. Це дозволяє нашому проекту повторно використовувати налаштування за замовчуванням Spring Boot.

Успадкувати проект spring-boot-starter-parent просто - нам потрібно лише вказати батьківський елемент у pom.xml :

 org.springframework.boot spring-boot-starter-parent 2.3.0.RELEASE 

Ми можемо знайти останню версію spring-boot-starter-parent на Maven Central.

Використовувати початковий батьківський проект зручно, але не завжди можливо. Наприклад, якщо наша компанія вимагає успадкування всіх проектів від стандартного POM, ми все одно можемо скористатися управлінням залежностями Spring Boot за допомогою власного батька.

Q4. Що таке Spring Initializr?

Spring Initializr - це зручний спосіб створити проект Spring Boot.

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

Це створює для нас каркасний проект і економить час налаштування, щоб ми могли зосередитися на додаванні бізнес-логіки.

Навіть коли ми використовуємо наш майстер проекту (наприклад, STS або Eclipse з плагіном STS) для створення проекту Spring Boot, він використовує Spring Initializr під капотом.

Q5. Які весняні стартери для завантаження доступні там?

Кожен стартер відіграє роль універсалу для всіх необхідних нам весняних технологій. Потім інші необхідні залежності транзитивно втягуються та керуються послідовно.

Усі стартери знаходяться в групі org.springframework.boot, і їхні імена починаються з spring-boot-starter- . Цей шаблон імен дозволяє легко знайти початківців, особливо під час роботи з середовищами розробки, які підтримують пошук залежностей за іменами.

На момент написання цієї статті в нашому розпорядженні понад 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, погляньте на Вступ до Spring Boot Starters.

Q6. Як вимкнути певну автоматичну конфігурацію?

Якщо ми хочемо , щоб відключити певну автоматичну конфігурацію, ми можемо вказати його з допомогою виключити атрибут @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. Як зареєструвати власну автоматичну конфігурацію?

To register an auto-configuration class, we must have its fully-qualified name listed under the EnableAutoConfiguration key in the META-INF/spring.factories file:

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

If we build a project with Maven, that file should be placed in the resources/META-INF directory, which will end up in the mentioned location during the package phase.

Q8. How to Tell an Auto-Configuration to Back Away When a Bean Exists?

To instruct an auto-configuration class to back off when a bean is already existent, we can use the @ConditionalOnMissingBean annotation. The most noticeable attributes of this annotation are:

  • value: The types of beans to be checked
  • name: The names of beans to be checked

When placed on a method adorned with @Bean, the target type defaults to the method's return type:

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

Q9. How to Deploy Spring Boot Web Applications as Jar and War Files?

Traditionally, we package a web application as a WAR file, then deploy it into an external server. Doing this allows us to arrange multiple applications on the same server. During the time that CPU and memory were scarce, this was a great way to save resources.

However, things have changed. Computer hardware is fairly cheap now, and the attention has turned to server configuration. A small mistake in configuring the server during deployment may lead to catastrophic consequences.

Spring tackles this problem by providing a plugin, namely spring-boot-maven-plugin, to package a web application as an executable JAR. To include this plugin, just add a plugin element to pom.xml:

 org.springframework.boot spring-boot-maven-plugin 

With this plugin in place, we'll get a fat JAR after executing the package phase. This JAR contains all the necessary dependencies, including an embedded server. Thus, we no longer need to worry about configuring an external server.

We can then run the application just like we would an ordinary executable JAR.

Notice that the packaging element in the pom.xml file must be set to jar to build a JAR file:

jar

If we don't include this element, it also defaults to jar.

In case we want to build a WAR file, change the packaging element to war:

war

And leave the container dependency off the packaged file:

 org.springframework.boot spring-boot-starter-tomcat provided 

After executing the Maven package phase, we'll have a deployable WAR file.

Q10. How to Use Spring Boot for Command Line Applications?

Just like any other Java program, a Spring Boot command line application must have a main method. This method serves as an entry point, which invokes the SpringApplication#run method to bootstrap the application:

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

The SpringApplication class then fires up a Spring container and auto-configures beans.

Notice we must pass a configuration class to the run method to work as the primary configuration source. By convention, this argument is the entry class itself.

After calling the run method, we can execute other statements as in a regular program.

Q11. What Are Possible Sources of External Configuration?

Spring Boot provides support for external configuration, allowing us to run the same application in various environments. We can use properties files, YAML files, environment variables, system properties, and command-line option arguments to specify configuration properties.

We can then gain access to those properties using the @Value annotation, a bound object via the @ConfigurationProperties annotation, or the Environment abstraction.

Q12. What Does it Mean that Spring Boot Supports Relaxed Binding?

Relaxed binding in Spring Boot is applicable to the type-safe binding of configuration properties.

With relaxed binding, the key of a property doesn't need to be an exact match of a property name. Such an environment property can be written in camelCase, kebab-case, snake_case, or in uppercase with words separated by underscores.

For example, if a property in a bean class with the @ConfigurationProperties annotation is named myProp, it can be bound to any of these environment properties: myProp, my-prop, my_prop, or MY_PROP.

Q13. What is Spring Boot Devtools Used For?

Spring Boot Developer Tools, or DevTools, is a set of tools making the development process easier. To include these development-time features, we just need to add a dependency to the pom.xml file:

 org.springframework.boot spring-boot-devtools 

The spring-boot-devtools module is automatically disabled if the application runs in production. The repackaging of archives also excludes this module by default. Hence, it won't bring any overhead to our final product.

By default, DevTools applies properties suitable to a development environment. These properties disable template caching, enable debug logging for the web group, and so on. As a result, we have this sensible development-time configuration without setting any properties.

Applications using DevTools restart whenever a file on the classpath changes. This is a very helpful feature in development, as it gives quick feedback for modifications.

By default, static resources, including view templates, don't set off a restart. Instead, a resource change triggers a browser refresh. Notice this can only happen if the LiveReload extension is installed in the browser to interact with the embedded LiveReload server that DevTools contains.

For further information on this topic, please see Overview of Spring Boot DevTools.

Q14. How to Write Integration Tests?

When running integration tests for a Spring application, we must have an ApplicationContext.

To make our life easier, Spring Boot provides a special annotation for testing – @SpringBootTest. This annotation creates an ApplicationContext from configuration classes indicated by its classes attribute.

In case the classes attribute isn't set, Spring Boot searches for the primary configuration class. The search starts from the package containing the test up until it finds a class annotated with @SpringBootApplication or @SpringBootConfiguration.

For detailed instructions, check out our tutorial on testing in Spring Boot.

Q15. What Is Spring Boot Actuator Used For?

Essentially, Actuator brings Spring Boot applications to life by enabling production-ready features. These features allow us to monitor and manage applications when they're running in production.

Integrating Spring Boot Actuator into a project is very simple. All we need to do is to include the spring-boot-starter-actuator starter in the pom.xml file:

 org.springframework.boot spring-boot-starter-actuator 

Spring Boot Actuator can expose operational information using either HTTP or JMX endpoints. Most applications go for HTTP, though, where the identity of an endpoint and the /actuator prefix form a URL path.

Here are some of the most common built-in endpoints Actuator provides:

  • env: Exposes environment properties
  • health: Shows application health information
  • httptrace: Displays HTTP trace information
  • info: Displays arbitrary application information
  • metrics: Shows metrics information
  • loggers: Shows and modifies the configuration of loggers in the application
  • mappings: Displays a list of all @RequestMapping paths

Please refer to our Spring Boot Actuator tutorial for a detailed rundown.

Q16. Which Is a Better Way to Configure a Spring Boot Project – Using Properties or YAML?

YAML offers many advantages over properties files, such as:

  • More clarity and better readability
  • Perfect for hierarchical configuration data, which is also represented in a better, more readable format
  • Support for maps, lists, and scalar types
  • Can include several profiles in the same file

However, writing it can be a little difficult and error-prone due to its indentation rules.

For details and working samples, please refer to our Spring YAML vs Properties tutorial.

Q17. What Are the Basic Annotations that Spring Boot Offers?

The primary annotations that Spring Boot offers reside in its org.springframework.boot.autoconfigure and its sub-packages. Here are a couple of basic ones:

  • @EnableAutoConfiguration – to make Spring Boot look for auto-configuration beans on its classpath and automatically apply them.
  • @SpringBootApplication – used to denote the main class of a Boot Application. This annotation combines @Configuration, @EnableAutoConfiguration, and @ComponentScan annotations with their default attributes.

Spring Boot Annotations offers more insight into the subject.

Q18. How Can You Change the Default Port in Spring Boot?

We can change the default port of a server embedded in Spring Boot using one of these ways:

  • using a properties file – we can define this in an application.properties (or application.yml) file using the property server.port
  • programmatically – in our main @SpringBootApplication class, we can set the server.port on the SpringApplication instance
  • using the command line – when running the application as a jar file, we can set the server.port as a java command argument:
    java -jar -Dserver.port=8081 myspringproject.jar 

Q19. Which Embedded Servers does Spring Boot Support, and How to Change the Default?

As of date, Spring MVC supports Tomcat, Jetty, and Undertow. Tomcat is the default application server supported by Spring Boot's web starter.

Spring WebFlux supports Reactor Netty, Tomcat, Jetty, and Undertow with Reactor Netty as default.

In Spring MVC, to change the default, let's say to Jetty, we need to exclude Tomcat and include Jetty in the dependencies:

 org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-tomcat     org.springframework.boot spring-boot-starter-jetty 

Similarly, to change the default in WebFlux to UnderTow, we need to exclude Reactor Netty and include UnderTow in the dependencies.

“Comparing embedded servlet contains in Spring Boot” contains more details on the different embedded servers we can use with Spring MVC.

Q20. Why Do We Need Spring Profiles?

When developing applications for the enterprise, we typically deal with multiple environments such as Dev, QA, and Prod. The configuration properties for these environments are different.

For example, we might be using an embedded H2 database for Dev, but Prod could have the proprietary Oracle or DB2. Even if the DBMS is the same across environments, the URLs would definitely be different.

Щоб зробити це простим та чистим, Spring пропонує профілі, які допомагають розділити конфігурацію для кожного середовища . Таким чином, замість того, щоб підтримувати це програмно, властивості можна зберігати в окремих файлах, таких як application-dev. властивості та застосування-прод. властивості . За замовчуванням application.propertie вказує на поточно активний профіль за допомогою пружини. профілі. активний, щоб було підібрано правильну конфігурацію.

Spring Profiles дає вичерпний погляд на цю тему.

3. Висновок

У цьому підручнику було розглянуто деякі найважливіші питання щодо Spring Boot, з якими ви можете зіткнутися під час технічного інтерв’ю. Ми сподіваємось, вони допоможуть вам знайти роботу, про яку ви мрієте.