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

Лучшие вопросы интервью Spring Framework

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

Оглавление

1. Обзор

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

2. Пружинное ядро

Q1. Что такое Spring Framework?

Spring является наиболее широко используемой средой для разработки приложений Java Enterprise Edition. Кроме того, основные функции Spring можно использовать при разработке любого Java-приложения.

Мы используем его расширения для создания различных веб-приложений на платформе Jakarta EE. Мы также можем просто использовать его положения о внедрении зависимостей в простых автономных приложениях.

Q2. Каковы преимущества использования Spring?

Spring стремится упростить разработку Jakarta EE, поэтому давайте рассмотрим преимущества:

  • Легкий — использование фреймворка в процессе разработки сопряжено с небольшими накладными расходами.
  • Инверсия управления (IoC) — контейнер Spring заботится о связывании зависимостей различных объектов вместо создания или поиска зависимых объектов.
  • Аспектно-ориентированное программирование (АОП) — Spring поддерживает АОП для отделения бизнес-логики от системных служб.
  • Контейнер IoC — управляет жизненным циклом Spring Bean и конфигурациями, специфичными для проекта.
  • Платформа MVC — используется для создания веб-приложений или веб-служб RESTful, способных возвращать ответы XML/JSON.
  • Управление транзакциями — сокращает объем шаблонного кода в операциях JDBC, загрузке файлов и т. д. либо с помощью аннотаций Java, либо с помощью XML-файла конфигурации Spring Bean.
  • Обработка исключений — Spring предоставляет удобный API для преобразования исключений, зависящих от технологии, в непроверенные исключения.

Q3. Какие подпроекты Spring вы знаете? Кратко опишите их.

  • Core — ключевой модуль, обеспечивающий основные части платформы, такие как IoC или DI.
  • JDBC - включает уровень абстракции JDBC, который устраняет необходимость кодирования JDBC для баз данных конкретных поставщиков.
  • Интеграция ORM — обеспечивает уровни интеграции для популярных API объектно-реляционного сопоставления, таких как JPA, JDO и Hibernate.
  • Web - веб-ориентированный модуль интеграции, который обеспечивает многокомпонентную загрузку файлов, прослушиватели сервлетов и функции контекста веб-приложений.
  • Платформа MVC - веб-модуль, реализующий шаблон проектирования Model View Controller.
  • Модуль АОП - реализация аспектно-ориентированного программирования, позволяющая определять чистые перехватчики методов и точки.

Q4. Что такое внедрение зависимостей?

Внедрение зависимостей, аспект инверсии управления (IoC), представляет собой общую концепцию, утверждающую, что мы не создаем наши объекты вручную, а вместо этого описываем, как они должны создаваться. Затем контейнер IoC будет создавать экземпляры необходимых классов, если это необходимо.

Для получения более подробной информации, пожалуйста, посмотрите здесь .

Q5. Как мы можем вводить бобы весной?

Существует несколько различных вариантов внедрения bean-компонентов Spring:

  • Инъекция сеттера
  • Внедрение конструктора
  • Полевая инъекция

Конфигурацию можно выполнить с помощью XML-файлов или аннотаций.

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

Q6. Как лучше всего вводить бобы и почему?

Рекомендуемый подход — использовать аргументы конструктора для обязательных зависимостей и сеттеры для необязательных. Это связано с тем, что внедрение конструктора позволяет вводить значения в неизменяемые поля и упрощает тестирование.

Q7. В чем разница между BeanFactory и ApplicationContext?

BeanFactory — это интерфейс, представляющий контейнер, который предоставляет экземпляры компонентов и управляет ими. Реализация по умолчанию лениво создает экземпляры bean-компонентов при вызове getBean() .

Напротив, ApplicationContext — это интерфейс, представляющий собой контейнер, содержащий всю информацию, метаданные и bean-компоненты в приложении. Он также расширяет интерфейс BeanFactory , но реализация по умолчанию с готовностью создает экземпляры bean-компонентов при запуске приложения. Однако это поведение можно переопределить для отдельных компонентов.

Все отличия смотрите в документации .

Q8. Что такое весенняя фасоль?

Spring Beans — это объекты Java, которые инициализируются контейнером Spring IoC.

Q9. Какова область действия компонента по умолчанию в Spring Framework?

По умолчанию Spring Bean инициализируется как синглтон .

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

Чтобы установить область действия Spring Bean, мы можем использовать аннотацию @Scope или атрибут «scope» в файлах конфигурации XML. Обратите внимание, что существует пять поддерживаемых областей:

  • Синглтон
  • Прототип
  • Запрос
  • Сессия
  • Глобальная сессия

Различия смотрите здесь .

Q11. Являются ли Singleton Beans потокобезопасными?

Нет, singleton bean-компоненты не потокобезопасны, поскольку потокобезопасность связана с выполнением, тогда как singleton — это шаблон проектирования, ориентированный на создание. Безопасность потоков зависит только от самой реализации компонента.

Q12. Как выглядит жизненный цикл Spring Bean?

Во-первых, необходимо создать экземпляр компонента Spring на основе определения компонента Java или XML. Также может потребоваться выполнить некоторую инициализацию, чтобы привести его в пригодное для использования состояние. После этого, когда бин больше не нужен, он будет удален из контейнера IoC.

Весь цикл со всеми методами инициализации показан на изображении ( источник ):

./0b401b60d7804817e94b0b48a3e623ea.jpg

Q13. Что такое конфигурация Spring на основе Java?

Это один из способов настройки приложений на основе Spring безопасным способом. Это альтернатива конфигурации на основе XML.

Также, чтобы перенести проект из XML в конфиг Java, обратитесь к этой статье .

Q14. Можем ли мы иметь несколько файлов конфигурации Spring в одном проекте?

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

Мы можем загрузить несколько файлов конфигурации на основе Java:

@Configuration
@Import({MainConfig.class, SchedulerConfig.class})
public class AppConfig {

Или мы можем загрузить один файл XML, который будет содержать все остальные конфиги:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-all.xml");

И внутри этого XML-файла у нас будет следующее:

<import resource="main.xml"/>
<import resource="scheduler.xml"/>

Q15. Что такое весенняя безопасность?

Spring Security — это отдельный модуль среды Spring, который фокусируется на предоставлении методов аутентификации и авторизации в приложениях Java. Он также позаботится о большинстве распространенных уязвимостей безопасности, таких как атаки CSRF.

Чтобы использовать Spring Security в веб-приложениях, мы можем начать с простой аннотации @EnableWebSecurity .

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

Q16. Что такое Spring Boot?

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

Q17. Назовите некоторые шаблоны проектирования, используемые в Spring Framework?

  • Singleton Pattern - bean-компоненты с одноэлементной областью видимости
  • Factory Pattern — классы Bean Factory
  • Шаблон прототипа - bean-компоненты с областью действия прототипа
  • Шаблон адаптера — Spring Web и Spring MVC
  • Шаблон прокси — поддержка аспектно-ориентированного программирования Spring
  • Шаблон метода шаблонаJdbcTemplate , HibernateTemplate и т. д.
  • Передний контроллер — Spring MVC DispatcherServlet
  • Объект доступа к данным — поддержка Spring DAO
  • Контроллер представления модели — Spring MVC

Q18. Как работает прототип Scope?

Прототип Scope означает, что каждый раз, когда мы вызываем экземпляр Bean, Spring будет создавать новый экземпляр и возвращать его. Это отличается от одноэлементной области по умолчанию, где один экземпляр объекта создается один раз для каждого контейнера Spring IoC.

3. Spring Web MVC

Q19. Как получить объекты ServletContext и ServletConfig в Spring Bean?

Мы можем сделать и то, и другое, реализовав интерфейсы с поддержкой Spring. Полный список доступен здесь .

Мы также можем использовать аннотацию @Autowired для этих компонентов:

@Autowired
ServletContext servletContext;

@Autowired
ServletConfig servletConfig;

Q20. Что такое контроллер в Spring MVC?

Проще говоря, все запросы, обрабатываемые DispatcherServlet , направляются к классам, аннотированным @Controller . Каждый класс контроллера сопоставляет один или несколько запросов с методами, которые обрабатывают и выполняют запросы с предоставленными входными данными.

Чтобы сделать шаг назад, мы рекомендуем взглянуть на концепцию Front Controller в типичной архитектуре Spring MVC .

Q21. Как работает аннотация @RequestMapping ?

Аннотация @RequestMapping используется для сопоставления веб-запросов с методами Spring Controller. Помимо простых вариантов использования, мы можем использовать его для сопоставления заголовков HTTP, привязки частей URI с помощью @PathVariable и работы с параметрами URI и аннотацией @RequestParam .

Более подробная информация о @RequestMapping доступна здесь .

Чтобы узнать больше о Spring MVC, ознакомьтесь с нашей статьей «Вопросы для собеседования по Spring MVC » .

4. Весенний доступ к данным

Q22. Что такое класс Spring JdbcTemplate и как его использовать?

Шаблон Spring JDBC — это основной API, через который мы можем получить доступ к интересующей нас логике операций с базой данных:

  • Создание и закрытие соединений
  • Выполнение операторов и вызовы хранимых процедур
  • Итерация по ResultSet и возврат результатов

Чтобы использовать его, нам нужно определить простую конфигурацию DataSource :

@Configuration
@ComponentScan("org.foreach.jdbc")
public class SpringJdbcConfig {
@Bean
public DataSource mysqlDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
dataSource.setUsername("guest_user");
dataSource.setPassword("guest_password");

return dataSource;
}
}

Для дальнейшего объяснения ознакомьтесь с этой быстрой статьей .

Q23. Как включить транзакции в Spring и каковы их преимущества?

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

Вот преимущества использования Spring Transactions, согласно официальной документации :

  • Обеспечить согласованную модель программирования для различных API-интерфейсов транзакций, таких как JTA, JDBC, Hibernate, JPA и JDO.
  • Поддержка декларативного управления транзакциями
  • Обеспечьте более простой API для программного управления транзакциями, чем некоторые сложные API транзакций, такие как JTA.
  • Очень хорошо интегрируется с различными абстракциями доступа к данным Spring.

Q24. Что такое Spring DAO?

Spring Data Access Object (DAO) — это поддержка Spring, обеспечивающая согласованную и простую работу с такими технологиями доступа к данным, как JDBC, Hibernate и JPA.

Существует целая серия, посвященная сохранению в Spring, которая обеспечивает более глубокий взгляд.

5. Spring Аспектно-ориентированное программирование

Q25. Что такое аспектно-ориентированное программирование (АОП)?

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

Вот пример регистрации времени выполнения на основе аспектов .

Q26. Что такое Aspect, Advice, Pointcut и JoinPoint в АОП?

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

Q27. Что такое ткачество?

Согласно официальной документации , плетение — это процесс, который связывает аспекты с другими типами приложений или объектами для создания рекомендуемого объекта. Это можно сделать во время компиляции, во время загрузки или во время выполнения. Spring AOP, как и другие чистые среды Java AOP, выполняет переплетение во время выполнения.

6. Весна 5

Q28. Что такое реактивное программирование?

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

Вот основные преимущества реактивного программирования:

  • Увеличение использования вычислительных ресурсов на многоядерном и многопроцессорном оборудовании.
  • Повышение производительности за счет уменьшения сериализации

Реактивное программирование обычно управляется событиями, в отличие от реактивных систем, которые управляются сообщениями. Таким образом, использование реактивного программирования не означает, что мы создаем реактивную систему, которая является архитектурным стилем.

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

Исходя из этого, реактивные системы обладают четырьмя важными характеристиками:

  • Отзывчивость — система должна реагировать своевременно.
  • Отказоустойчивость — в случае сбоя системы она должна оставаться отзывчивой.
  • Эластичность . Реактивные системы могут реагировать на изменения и оставаться гибкими при различной рабочей нагрузке.
  • Управляемый сообщениями . Реактивным системам необходимо установить границу между компонентами, полагаясь на асинхронную передачу сообщений.

Q29. Что такое Spring WebFlux?

Spring WebFlux — это веб-фреймворк Spring с реактивным стеком, альтернатива Spring MVC.

Чтобы реализовать эту реактивную модель и обеспечить высокую масштабируемость, весь стек является неблокирующим. Ознакомьтесь с нашим руководством по Spring 5 WebFlux для получения дополнительной информации.

Q30. Что такое типы Mono и Flux?

Платформа WebFlux в Spring Framework 5 использует Reactor в качестве своей асинхронной основы.

Этот проект предоставляет два основных типа: Mono для представления одного асинхронного значения и Flux для представления потока асинхронных значений. Оба они также реализуют интерфейс Publisher , определенный в спецификации Reactive Streams .

Mono реализует Publisher и возвращает 0 или 1 элемент:

public abstract class Mono<T> implements Publisher<T> {...}

А Flux реализует Publisher и возвращает N элементов:

public abstract class Flux<T> implements Publisher<T> {...}

По определению, эти два типа представляют потоки, поэтому они оба ленивы. Это означает, что ничего не выполняется, пока мы не используем поток с помощью метода subscribe() . Оба типа также являются неизменяемыми, поэтому вызов любого метода вернет новый экземпляр Flux или Mono .

Q31. Какая польза от WebClient и WebTestClient ?

WebClient — это компонент новой среды Web Reactive, который может действовать как реактивный клиент для выполнения неблокирующих HTTP-запросов. Поскольку это реактивный клиент, он может обрабатывать реактивные потоки с обратным давлением и может в полной мере использовать лямбда-выражения Java 8. Он также может обрабатывать как синхронные, так и асинхронные сценарии.

С другой стороны, WebTestClient — это аналогичный класс, который мы можем использовать в тестах. По сути, это тонкая оболочка вокруг WebClient. Он может подключаться к любому серверу через HTTP-соединение. Он также может напрямую связываться с приложениями WebFlux, используя фиктивные объекты запросов и ответов, без необходимости использования HTTP-сервера.

Q32. Каковы недостатки использования реактивных потоков?

Есть несколько основных недостатков использования реактивных потоков:

  • Устранение неполадок с реактивным приложением немного сложно, поэтому обязательно ознакомьтесь с нашим руководством по отладке реактивных потоков , чтобы получить несколько полезных советов по отладке.
  • Существует ограниченная поддержка реактивных хранилищ данных, поскольку традиционные реляционные хранилища данных еще не приняли реактивную парадигму.
  • При реализации требуется дополнительная кривая обучения.

Q33. Совместим ли Spring 5 со старыми версиями Java?

Чтобы воспользоваться преимуществами Java 8, кодовая база Spring была переработана. Это означает, что более старые версии Java использовать нельзя. Итак, фреймворк требует как минимум Java 8.

Q34. Как Spring 5 интегрируется с модульностью JDK 9?

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

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

Давайте рассмотрим пример, чтобы понять функциональность нового модуля в Java 9 и то, как организовать проект Spring 5 на основе этой концепции.

Сначала мы создадим новый класс, содержащий единственный метод для возврата строки «HelloWorld». Мы поместим это в новый проект Java — HelloWorldModule :

package com.hello;
public class HelloWorld {
public String sayHello(){
return "HelloWorld";
}
}

Затем создаем новый модуль:

module com.hello {
export com.hello;
}

Теперь давайте создадим новый проект Java, HelloWorldClient , чтобы использовать вышеуказанный модуль, определив модуль:

module com.hello.client {
requires com.hello;
}

Вышеупомянутый модуль будет доступен для тестирования сейчас:

public class HelloWorldClient {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
log.info(helloWorld.sayHello());
}
}

Q35. Можем ли мы использовать как Web MVC, так и WebFlux в одном приложении?

На данный момент Spring Boot разрешает только Spring MVC или Spring WebFlux, поскольку Spring Boot пытается автоматически настроить контекст в зависимости от зависимостей, существующих в его пути к классам.

Кроме того, Spring MVC не может работать на Netty. Более того, MVC — это блокирующая парадигма, а WebFlux — неблокирующий стиль. Таким образом, мы не должны смешивать их вместе, потому что они служат разным целям.

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

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

Мы надеемся, что эта статья поможет вам в предстоящих весенних интервью. Удачи!