I have posted a lot of Spring Tutorials recently. This post will help you get through Spring interview Questions explaining the core concepts in detail.
Spring Framework – один из самых популярных фреймворков Java EE для веб-приложений. Dependency Injection и Aspect-Oriented Programming – в самом центре Spring Framework. Если вы хорошо разбираетесь в Spring Framework, у вас очень высоки шансы быть выбранным на собеседованиях по Java.
Подсказка: Core Java – основа любого Java-фреймворка, поэтому, если вы готовитесь к интервью, рекомендуется ознакомиться с вопросами Core Java Interview и Java Interview Questions.
Вопросы и ответы на собеседовании по Spring
Здесь я предоставляю почти 50 вопросов и ответов на собеседование по Spring. Информация актуальна до версии Spring 5, поэтому охватывает все последние функции, такие как Spring WebFlux для реактивного программирования.
1. Что такое Spring Framework?
Spring – один из самых широко используемых фреймворков Java EE. Основными концепциями Spring являются “Внедрение зависимостей” и “Аспектно-ориентированное программирование”.
Spring framework также может использоваться в обычных Java-приложениях для достижения слабой связности между различными компонентами путем реализации внедрения зависимостей. Мы можем выполнять перекрывающиеся задачи, такие как ведение журнала и аутентификация, с использованием поддержки Spring для аспектно-ориентированного программирования.
I like spring because it provides a lot of features and different modules for specific tasks such as Spring MVC and Spring JDBC. Since it’s an open-source framework with a lot of online resources and active community members, working with the Spring framework is easy and fun at the same time.
Рекомендуемое чтение: Spring Framework
2. Каковы некоторые важные особенности Spring Framework?
Spring Framework построен на основе двух концепций проектирования – Внедрение зависимостей и Аспектно-ориентированное программирование.
Некоторые из особенностей Spring Framework:
- Легковесность и минимальные накладные расходы при использовании фреймворка для разработки.
- Внедрение зависимостей или инверсия управления для написания компонентов, которые независимы друг от друга, контейнер Spring берет на себя их связывание для достижения нашей работы.
- Контейнер Spring IoC управляет жизненным циклом Spring Bean и конфигурациями, специфичными для проекта, такими как поиск JNDI.
- Фреймворк Spring MVC можно использовать для создания веб-приложений, а также для создания RESTful веб-сервисов, способных возвращать как XML, так и JSON-ответы.
- Поддержка управления транзакциями, операций JDBC, загрузки файлов, обработки исключений и т. д. с минимальным количеством конфигураций, как с использованием аннотаций, так и с помощью файла конфигурации Spring Bean.
3. В чем преимущество использования Spring Framework?
Некоторые из преимуществ использования Spring Framework:
- Снижение прямых зависимостей между различными компонентами приложения. Контейнер Spring IoC отвечает за инициализацию ресурсов или бинов и внедрение их в качестве зависимостей.
- Написание модульных тестов просто в фреймворке Spring, потому что наша бизнес-логика не зависит напрямую от фактических классов реализации ресурсов. Мы легко можем написать конфигурацию теста и внедрить наши макетные бины для тестирования.
- Уменьшает количество шаблонного кода, такого как инициализация объектов, открытие/закрытие ресурсов. Мне очень нравится класс JdbcTemplate, потому что он помогает нам избавиться от всего шаблонного кода, который идет вместе с программированием JDBC.
- Spring framework делится на несколько модулей, это помогает нам делать наше приложение легковесным. Например, если нам не нужны функции управления транзакциями Spring, нам не нужно добавлять эту зависимость в наш проект.
- Spring framework поддерживает большинство функций Java EE и даже гораздо больше. Он всегда находится на грани новых технологий, например, есть проект Spring для Android, чтобы помочь нам писать лучший код для нативных Android-приложений. Это делает Spring framework полным пакетом, и нам не нужно искать разные фреймворки для разных требований.
4. Какие важные особенности Spring 5?
Spring 5 является значительным обновлением по сравнению с Spring 4. Некоторые из важных особенностей:
- Поддержка Java 8 и более новых версий, так что мы можем использовать лямбда-выражения.
- Поддержка Java EE7 и спецификаций Servlet 4.0.
- Операции с файлами теперь выполняются через потоки NIO 2, что является огромным улучшением, если ваше приложение выполняет много операций с файлами.
- Введение spring-jcl для упрощения логирования, раньше это было путаницей из-за отсутствия единой точки для целей логирования.
- Поддержка Kotlin, Lombok, Reactor 3.1 Flux, и Mono, а также RxJava.
- Spring WebFlux, который приносит реактивное программирование в Spring.
- Поддержка JUnit 5
- Поддержка предоставления информации о компонентах Spring через индексный файл “META-INF/spring.components” вместо сканирования classpath.
Пожалуйста, ознакомьтесь с особенностями Spring 5, чтобы получить подробный обзор этого релиза.
5. Что такое Spring WebFlux?
Spring WebFlux – это новый модуль, введенный в Spring 5. Spring WebFlux – это первый шаг к реактивной модели программирования в Spring Framework.
Spring WebFlux является альтернативой модулю Spring MVC. Spring WebFlux используется для создания полностью асинхронных и неблокирующих приложений, построенных на модели выполнения событийного цикла.
Вы можете узнать больше об этом в Руководстве по Spring WebFlux.
6. Что вы понимаете под Инъекцией Зависимостей?
Паттерн проектирования Инъекции Зависимостей позволяет нам избавиться от жестко закодированных зависимостей и сделать наше приложение слабо связанным, расширяемым и поддерживаемым. Мы можем реализовать паттерн инъекции зависимостей для перемещения разрешения зависимостей из времени компиляции во время выполнения.
Некоторые преимущества использования инъекции зависимости – это разделение ответственности, уменьшение количества шаблонного кода, настраиваемые компоненты и упрощение модульного тестирования.
Подробнее читайте в Учебнике по инъекции зависимости. Мы также можем использовать Google Guice для инъекции зависимостей, чтобы автоматизировать процесс инъекции зависимостей. Но в большинстве случаев мы ищем не только инъекцию зависимостей, и здесь Spring занимает лидирующие позиции.
7. Как мы реализуем DI в Spring Framework?
Мы можем использовать конфигурацию Spring на основе XML и на основе аннотаций для реализации DI в приложениях Spring. Для лучшего понимания ознакомьтесь с примером Внедрения зависимости в Spring, где вы можете изучить оба подхода с помощью тестового случая JUnit. В посте также есть архив с образцом проекта, который вы можете скачать и изучить подробнее.
8. Какие преимущества использования Spring Tool Suite?
Мы можем установить плагины в Eclipse, чтобы получить все функции Spring Tool Suite. Однако STS поставляется с Eclipse с некоторыми другими важными вещами, такими как поддержка Maven, шаблоны для создания различных типов проектов Spring и tc server для лучшей производительности с приложениями Spring.
I like STS because it highlights the Spring components and if you are using AOP pointcuts and advice, then it clearly shows which methods will come under the specific pointcut. So rather than installing everything on our own, I prefer using STS when developing Spring-based applications.
9. Назовите некоторые из важных модулей Spring?
Некоторые из важных модулей Spring Framework:
- Spring Context – для внедрения зависимостей.
- Spring AOP – для аспектно-ориентированного программирования.
- Spring DAO – для операций с базой данных с использованием шаблона DAO.
- Spring JDBC – для поддержки JDBC и DataSource.
- Spring ORM – для поддержки инструментов ORM, таких как Hibernate.
- Spring Web Module – для создания веб-приложений.
- Spring MVC – реализация модели-представления-контроллера для создания веб-приложений, веб-сервисов и т. д.
10. Что вы понимаете под аспектно-ориентированным программированием?
Приложения предприятия имеют некоторые общие поперечные задачи, которые применимы к различным типам объектов и модулей приложений, такие как ведение журнала, управление транзакциями, проверка данных, аутентификация и т. д. Модульность приложения достигается с помощью классов в объектно-ориентированном программировании. В АОП модульность приложения достигается с помощью аспектов, которые настраиваются для охвата различных методов класса.
АОП устраняет прямую зависимость поперечных задач от классов, что невозможно в обычном объектно-ориентированном программировании. Например, мы можем иметь отдельный класс для ведения журнала, но другие классы должны вызывать эти методы. Однако в АОП мы настраиваем аспекты, и выполнение метода происходит автоматически. Подробнее о поддержке Spring AOP смотрите в примере Spring AOP Example.
11. Что такое аспект, совет, точка входа, совместная точка и аргументы совета в АОП?
Аспект: Аспект – это класс, который реализует поперечные заботы, такие как управление транзакциями. Аспекты могут быть обычным классом, настроенным в конфигурационном файле Spring Bean, или мы можем использовать поддержку Spring AspectJ, чтобы объявить класс как аспект с помощью аннотации @Aspect
.
Совет: Совет – это действие, выполняемое для определенной точки соединения. В терминах программирования это методы, которые выполняются, когда в приложении достигается определенная точка соединения с соответствующим pointcut. Вы можете думать о Советах как о перехватчиках Spring или фильтрах Servlet.
Точка врезки: Точки врезки – это регулярные выражения, сопоставляемые с точками соединения, чтобы определить, нужно ли выполнять советы или нет. Точка врезки использует различные виды выражений, сопоставляемых с точками соединения. В Spring Framework используется язык выражений точек соединения AspectJ для определения точек соединения, в которых будут применяться методы советов.
Точка соединения: Точка соединения – это конкретная точка в приложении, такая как выполнение метода, обработка исключения, изменение значений переменных объекта и т. д. В Spring AOP точкой соединения всегда является выполнение метода.
Аргументы советов: Мы можем передавать аргументы в методы советов. Мы можем использовать выражение args() в точке среза, которое будет применяться к любому методу, соответствующему шаблону аргумента. Если мы используем это, то нам нужно использовать то же имя в методе совета, откуда определяется тип аргумента.
Эти концепции кажутся запутанными сначала, но если вы пройдете через Spring Aspect, Пример совета, то вы легко сможете их связать.
12. В чем разница между Spring AOP и AspectJ AOP?
AspectJ является стандартной реализацией программирования с ориентацией на аспекты, тогда как Spring реализует AOP только для некоторых случаев. Основные различия между Spring AOP и AspectJ:
- Spring AOP проще в использовании, чем AspectJ, потому что нам не нужно беспокоиться о процессе плетения.
- Spring AOP поддерживает аннотации AspectJ, поэтому, если вы знакомы с AspectJ, то работа с Spring AOP проще.
- Spring AOP поддерживает только основанный на прокси AOP, поэтому он может быть применен только к точкам соединения выполнения метода. AspectJ поддерживает все виды точек среза.
- Одним из недостатков Spring AOP является то, что его можно применять только к бинам, созданным через контекст Spring.
13. Что такое контейнер Spring IoC?
Инверсия управления (IoC) – механизм достижения слабой связности между объектными зависимостями. Для достижения слабой связности и динамического связывания объекты определяют свои зависимости, которые инъекцируются другими объектами-сборщиками. Контейнер Spring IoC – это программа, которая внедряет зависимости в объект и готовит его к использованию.
Классы контейнера IoC в Spring Framework входят в пакеты org.springframework.beans
и org.springframework.context
и предоставляют различные способы развязки зависимостей объектов.
Некоторые полезные реализации ApplicationContext, которые мы используем, включают;
- AnnotationConfigApplicationContext: Для автономных java-приложений с использованием конфигурации на основе аннотаций.
- ClassPathXmlApplicationContext: Для автономных java-приложений с использованием конфигурации на основе XML.
- FileSystemXmlApplicationContext: Аналог ClassPathXmlApplicationContext, за исключением того, что XML-файл конфигурации может быть загружен откуда угодно в файловой системе.
- AnnotationConfigWebApplicationContext и XmlWebApplicationContext для веб-приложений.
14. Что такое Spring Bean?
Любой обычный класс Java, инициализированный контейнером управления инверсией управления (IoC) Spring, называется Spring Bean. Мы используем Spring ApplicationContext
, чтобы получить экземпляр Spring Bean.
Контейнер управления IoC Spring управляет жизненным циклом Spring Bean, областями видимости бина и внедрением необходимых зависимостей в бин.
15. Какова важность файла конфигурации Spring Bean?
Мы используем файл конфигурации Spring Bean для определения всех бинов, которые будут инициализированы контекстом Spring. При создании экземпляра Spring ApplicationContext он считывает XML-файл бина Spring и инициализирует их все. После инициализации контекста мы можем использовать его для получения различных экземпляров бинов.
Помимо конфигурации Spring Bean, этот файл также содержит интерсепторы Spring MVC, разрешители представлений и другие элементы для поддержки конфигураций на основе аннотаций.
16. Какие различные способы конфигурации класса как бина Spring?
Существует три различных способа конфигурации Spring Bean.
XML-конфигурация: Это самый популярный способ конфигурации, и мы можем использовать элемент bean в файле контекста для настройки Spring Bean. Например:
<bean name="myBean" class="com.journaldev.spring.beans.MyBean"></bean>
Конфигурация на основе Java: Если вы используете только аннотации, вы можете настроить Spring Bean с использованием аннотации @Bean
. Эта аннотация используется вместе с классами @Configuration
для конфигурации Spring Bean. Пример конфигурации:
@Configuration
@ComponentScan(value="com.journaldev.spring.main")
public class MyConfiguration {
@Bean
public MyService getService(){
return new MyService();
}
}
Чтобы получить этот бин из контекста Spring, необходимо использовать следующий фрагмент кода:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
Конфигурация на основе аннотаций: Мы также можем использовать аннотации @Component, @Service, @Repository и @Controller с классами для их конфигурации в качестве бина Spring. Для этого нужно указать базовое местоположение пакета для сканирования этих классов. Например:
<context:component-scan base-package="com.journaldev.spring" />
17. Каковы различные области видимости Spring Bean?
Для Spring Bean определены пять областей видимости.
- singleton: Для каждого контейнера будет создан только один экземпляр бина. Это область видимости по умолчанию для бинов в Spring. При использовании этой области видимости убедитесь, что у бина Spring нет общих переменных экземпляра, иначе это может привести к проблемам с несогласованностью данных из-за отсутствия защиты потоков.
- prototype: Новый экземпляр будет создаваться каждый раз, когда запрашивается бин.
- request: Это то же самое, что и область видимости prototype, однако предназначено для использования в веб-приложениях. Новый экземпляр бина будет создаваться для каждого HTTP-запроса.
- session: Для каждой HTTP-сессии контейнер будет создавать новый бин.
- global-session: Используется для создания глобальных сессионных бинов для портлет-приложений.
Фреймворк Spring является расширяемым, и мы можем создавать свои собственные области видимости. Однако в большинстве случаев мы можем обойтись областями видимости, предоставленными фреймворком. Для установки областей видимости бинов Spring мы можем использовать атрибут “scope” в элементе бина или аннотацию @Scope для конфигураций на основе аннотаций.
18. Каков жизненный цикл Spring Bean?
Spring Beans инициализируются контейнером Spring, и все зависимости также внедряются. Когда контекст уничтожается, он также уничтожает все инициализированные бины. Это работает хорошо в большинстве случаев, но иногда нам нужно инициализировать другие ресурсы или выполнить некоторую проверку перед тем, как наши бины будут готовы к использованию. Фреймворк Spring предоставляет поддержку методов пост-инициализации и предварительного уничтожения в бинах Spring.
Мы можем сделать это двумя способами – реализуя интерфейсы InitializingBean
и DisposableBean
или используя атрибуты init-method и destroy-method в конфигурациях бинов Spring. Для получения более подробной информации, пожалуйста, прочитайте Методы жизненного цикла бина Spring.
19. Как получить объекты ServletContext и ServletConfig в Spring Bean?
Существует два способа получить объекты, специфичные для контейнера, в бине Spring.
- Реализация интерфейсов Spring *Aware, таких как ServletContextAware и ServletConfigAware, приведена в полном примере этих интерфейсов. Пожалуйста, ознакомьтесь с Spring Aware Interfaces для подробного примера.
- Используйте аннотацию
@Autowired
с переменными бина типаServletContext
иServletConfig
. Они будут работать только в средах, специфичных для контейнера сервлетов.
@Autowired
ServletContext servletContext;
20. Что такое проводка бина и @Autowired аннотация?
Процесс внедрения зависимостей бина Spring при инициализации называется проводкой бина Spring.
Обычно лучше всего явно проводить все зависимости бина, но фреймворк Spring также поддерживает автоматическую проводку. Мы можем использовать аннотацию @Autowired
с полями или методами для автоматической проводки по типу. Для работы этой аннотации также необходимо включить конфигурацию на основе аннотаций в файле конфигурации бина Spring. Это можно сделать с помощью элемента context:annotation-config.
Дополнительные сведения о аннотации @Autowired
можно найти в примере автоматической проводки Spring.
21. Какие существуют различные типы автосвязывания Spring Bean?
Существует четыре типа автосвязывания в Spring framework.
- автосвязывание по имени (autowire byName)
- автосвязывание по типу (autowire byType)
- автосвязывание через конструктор (autowire by constructor)
- Автосвязывание с использованием аннотаций @Autowired и @Qualifier
До версии Spring 3.1 также поддерживалось автосвязывание с автоопределением (autowire by autodetect), которое было аналогично автосвязыванию через конструктор или по типу. Для получения дополнительной информации об этих параметрах ознакомьтесь с Автосвязыванием бинов Spring.
22. Предоставляет ли Spring Bean потокобезопасность?
Скоупом по умолчанию для Spring bean является синглтон, поэтому в контексте будет только один экземпляр. Это означает, что если у класса есть переменная уровня класса, которую может обновить любой поток, это может привести к несогласованным данным. Таким образом, в режиме по умолчанию Spring beans не являются потокобезопасными.
Однако мы можем изменить область видимости бинов весной на запрос, прототип или сессию, чтобы обеспечить безопасность потоков за счет производительности. Это решение проектирования, основанное на требованиях проекта.
23. Что такое контроллер в Spring MVC?
Как и в шаблоне проектирования MVC, контроллер – это класс, который обрабатывает все запросы клиента и отправляет их на настроенные ресурсы для их обработки. В Spring MVC, DispatcherServlet является классом фронт-контроллера, который инициализирует контекст на основе конфигураций весенних бинов.
A Controller class is responsible to handle a different kind of client requests based on the request mappings. We can create a controller class by using @Controller annotation. Usually, it’s used with @RequestMapping annotation to define handler methods for specific URI mapping.
24. В чем разница между @Component, @Controller, @Repository & @Service аннотациями в Spring?
@Component используется для указания того, что класс является компонентом. Эти классы используются для автоматического обнаружения и конфигурируются как бин, когда используются аннотационные конфигурации.
@Controller является конкретным типом компонента, используемым в приложениях MVC и в основном используется с аннотацией RequestMapping.
@Repository аннотация используется для указания того, что компонент используется как репозиторий и механизм для хранения/извлечения/поиска данных. Мы можем применить эту аннотацию с классами реализации шаблона DAO.
@Service используется для указания того, что класс является сервисом. Обычно аннотируются классы фасада бизнеса, предоставляющие какие-то услуги.
Мы можем использовать любую из вышеупомянутых аннотаций для класса для автоматического обнаружения, но предоставляются различные типы, чтобы вы могли легко отличить цель аннотированных классов.
25. Что такое DispatcherServlet и ContextLoaderListener?
DispatcherServlet является контроллером в приложении Spring MVC, который загружает файл конфигурации бина Spring и инициализирует все настроенные бины. Если включены аннотации, он также сканирует пакеты и конфигурирует любой бин, помеченный аннотациями @Component, @Controller, @Repository или @Service.
ContextLoaderListener – это слушатель для запуска и завершения корневого WebApplicationContext в Spring. Его важные функции заключаются в связывании жизненного цикла ApplicationContext с жизненным циклом ServletContext и автоматизации создания ApplicationContext. Мы можем использовать его для определения общих бинов, которые могут использоваться в различных контекстах Spring.
26. Что такое ViewResolver в Spring?
Реализации ViewResolver используются для разрешения страниц представлений по их имени. Мы конфигурируем это в файле конфигурации бина Spring. Например:
<!-- Разрешает представления, выбранные для отображения @Controllers, к ресурсам .jsp в каталоге /WEB-INF/views -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
InternalResourceViewResolver является одной из реализаций интерфейса ViewResolver, и мы предоставляем директорию страниц представлений и расположение суффикса через свойства бина. Таким образом, если метод обработчика контроллера возвращает «home», решатель представлений будет использовать страницу представления, расположенную в /WEB-INF/views/home.jsp.
27. Что такое MultipartResolver и когда он используется?
Интерфейс MultipartResolver используется для загрузки файлов – CommonsMultipartResolver и StandardServletMultipartResolver являются двумя реализациями, предоставленными Spring Framework для загрузки файлов. По умолчанию мультипарт-решатели не настроены, но для их использования для загрузки файлов все, что нам нужно, это определить бин с именем «multipartResolver» типа MultipartResolver в конфигурациях бина Spring.
После настройки любой мультипарт-запрос будет разрешен настроенным MultipartResolver и передан в обернутом HttpServletRequest. Затем он используется в классе контроллера для получения файла и его обработки. Для полного примера, пожалуйста, прочитайте Пример загрузки файла в Spring MVC.
28. Как обрабатывать исключения в Spring MVC Framework?
Spring MVC Framework предоставляет следующие способы для обеспечения надежной обработки исключений.
На основе контроллера – Мы можем определить методы обработчика исключений в наших классах контроллера. Все, что нам нужно сделать, это аннотировать эти методы аннотацией @ExceptionHandler.
Глобальный обработчик исключений – Обработка исключений является пересекающимся аспектом и Spring предоставляет аннотацию @ControllerAdvice, которую мы можем использовать с любым классом для определения нашего глобального обработчика исключений.
Реализация HandlerExceptionResolver – Для общих исключений большую часть времени мы обслуживаем статические страницы. Spring Framework предоставляет интерфейс HandlerExceptionResolver, который мы можем реализовать для создания глобального обработчика исключений. Причина этого дополнительного способа определения глобального обработчика исключений заключается в том, что Spring framework также предоставляет классы реализации по умолчанию, которые мы можем определить в нашем конфигурационном файле бина Spring для получения преимуществ обработки исключений фреймворка Spring.
Для полного примера ознакомьтесь с Пример обработки исключений Spring.
29. Как создать контекст приложения в программе Java?
Есть несколько способов создания контекста Spring в автономной java-программе.
- AnnotationConfigApplicationContext: Если мы используем Spring в автономных java-приложениях и аннотации для конфигурации, то мы можем использовать это для инициализации контейнера и получения объектов бина.
- ClassPathXmlApplicationContext: Если у нас есть файл конфигурации бина Spring в автономном приложении, то мы можем использовать этот класс для загрузки файла и получения объекта контейнера.
- FileSystemXmlApplicationContext: Это аналог ClassPathXmlApplicationContext за исключением того, что файл конфигурации XML может быть загружен откуда угодно в файловой системе.
30. Можем ли мы иметь несколько файлов конфигурации Spring?
Для приложений Spring MVC мы можем определить несколько файлов конфигурации контекста Spring с помощью параметра contextConfigLocation. Эта строка местоположения может состоять из нескольких местоположений, разделенных любым количеством запятых и пробелов. Например;
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml,/WEB-INF/spring/appServlet/servlet-jdbc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Мы также можем определить несколько конфигураций корневого уровня Spring и загрузить их через параметр context-param. Например;
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml /WEB-INF/spring/root-security.xml</param-value>
</context-param>
Еще один вариант – использовать элемент import в файле конфигурации контекста для импорта других конфигураций, например:
<beans:import resource="spring-jdbc.xml"/>
31. Что такое ContextLoaderListener?
ContextLoaderListener – это класс прослушивателя, используемый для загрузки корневого контекста и определения конфигураций бинов Spring, которые будут видны всем остальным контекстам. Он настраивается в файле web.xml следующим образом:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
32. Какие минимальные конфигурации необходимы для создания приложения Spring MVC?
Для создания простого приложения Spring MVC нам нужно выполнить следующие задачи.
- Добавить зависимости
spring-context
иspring-webmvc
в проект. - Настройте
DispatcherServlet
в файле web.xml для обработки запросов через контейнер Spring. - Файл конфигурации Spring bean предназначен для определения бинов. Если используются аннотации, их также необходимо настроить здесь. Кроме того, нам нужно настроить разрешитель представлений для страниц представлений.
- Класс контроллера с определенными отображениями запросов для обработки запросов клиентов.
Вышеуказанных шагов должно быть достаточно для создания простого приложения “Привет, мир” Spring MVC.
33. Как вы связали бы Spring MVC Framework с архитектурой MVC?
Как следует из названия, Spring MVC построен на основе архитектуры Model-View-Controller. DispatcherServlet
является фронт-контроллером в приложении Spring MVC, который обрабатывает все входящие запросы и направляет их на различные методы обработчика контроллера.
Модель может быть любым Java Bean в Spring Framework, как и в любой другой MVC-фреймворк, Spring обеспечивает автоматическое связывание данных формы с Java Beans. Мы можем устанавливать бины модели в качестве атрибутов, которые будут использоваться на страницах представлений.
Страницы представлений могут быть JSP, статическим HTML и т. д., а разрешители представлений отвечают за поиск правильной страницы представления. После определения страницы представления управление возвращается контроллеру DispatcherServlet. DispatcherServlet отвечает за отображение представления и возврат конечного ответа клиенту.
34. Как достичь локализации в приложениях Spring MVC?
Spring предоставляет отличную поддержку локализации или i18n через ресурсные пакеты. Основные шаги, необходимые для локализации нашего приложения, включают в себя:
- Создание ресурсных пакетов сообщений для разных локалей, таких как messages_en.properties, messages_fr.properties и т. д.
- Определение бина messageSource в файле конфигурации бинов Spring типа ResourceBundleMessageSource или ReloadableResourceBundleMessageSource.
- Для поддержки изменения локали определите бин localeResolver типа CookieLocaleResolver и настройте перехватчик LocaleChangeInterceptor. Пример конфигурации показан ниже:
<beans:bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:messages" />
<beans:property name="defaultEncoding" value="UTF-8" />
</beans:bean>
<beans:bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<beans:property name="defaultLocale" value="en" />
<beans:property name="cookieName" value="myAppLocaleCookie"></beans:property>
<beans:property name="cookieMaxAge" value="3600"></beans:property>
</beans:bean>
<interceptors>
<beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="locale" />
</beans:bean>
</interceptors>
- Используйте элемент
spring:message
на страницах представления с ключевыми именами, DispatcherServlet выбирает соответствующее значение и отображает страницу в соответствующей локали, возвращая ее в качестве ответа.
Для полного примера ознакомьтесь с Примером локализации Spring.
35. Как использовать Spring для создания Restful веб-сервиса, возвращающего JSON-ответ?
Мы можем использовать фреймворк Spring для создания Restful веб-сервисов, возвращающих данные в формате JSON. Spring предоставляет интеграцию с библиотекой Jackson JSON API, которую мы можем использовать для отправки JSON-ответов в Restful веб-сервисе.
Для настройки нашего приложения Spring MVC для отправки JSON-ответа нам нужно выполнить следующие шаги.
1. Добавить зависимости Jackson JSON. Если вы используете Maven, это можно сделать следующим кодом:
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind-version}</version>
</dependency>
2. Настроить бин RequestMappingHandlerAdapter в файле конфигурации Spring и установить свойство message converters в бин MappingJackson2HttpMessageConverter. Пример конфигурации:
<!-- Настроить подключение JSON в качестве запроса и ответа в обработчике метода -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter"/>
</beans:list>
</beans:property>
</beans:bean>
<!-- Настроить бин для преобразования JSON в POJO и наоборот -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>
3. В методах обработчика контроллера вернуть объект в качестве ответа, используя аннотацию @ResponseBody
. Пример кода:
@RequestMapping(value = EmpRestURIConstants.GET_EMP, method = RequestMethod.GET)
public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) {
logger.info("Start getEmployee. ID="+empId);
return empData.get(empId);
}
4. Вы можете вызвать Rest-сервис с использованием любого API, но если вы хотите использовать Spring, вы легко можете сделать это, используя класс RestTemplate.
Для полного примера ознакомьтесь с Примером Spring Restful Webservice.
36. Какие важные аннотации Spring вы использовали?
Некоторые из аннотаций Spring, которые я использовал в своем проекте, это:
- @Controller – для классов контроллеров в проекте Spring MVC.
- @RequestMapping – для конфигурации сопоставления URI в методах обработчиков контроллера. Это очень важная аннотация, поэтому вы должны ознакомиться с Примерами использования аннотации Spring MVC RequestMapping
- @ResponseBody – для отправки объекта в качестве ответа, обычно для отправки данных в формате XML или JSON в качестве ответа.
- @PathVariable – для сопоставления динамических значений из URI с аргументами метода обработчика.
- @Autowired – для автоматического связывания зависимостей в бинах Spring.
- @Qualifier – с аннотацией @Autowired для избежания путаницы при наличии нескольких экземпляров типа бина.
- @Service – для классов сервисов.
- @Scope – для настройки области видимости бина Spring.
- @Configuration, @ComponentScan и @Bean – для конфигураций на основе Java.
- Аннотации AspectJ для настройки аспектов и советов, @Aspect, @Before, @After, @Around, @Pointcut и т. д.
37. Можем ли мы отправлять объект как ответ метода обработчика контроллера?
Да, мы можем, используя аннотацию @ResponseBody. Вот как мы отправляем ответ на основе JSON или XML в restful веб-сервисах.
38. Как загрузить файлы в приложении Spring MVC?
Spring предоставляет встроенную поддержку загрузки файлов через реализации интерфейса MultipartResolver. Это очень легко использовать и требует только изменений конфигурации, чтобы заставить его работать. Нам нужно написать метод обработчика контроллера, чтобы обработать входящий файл и обработать его. Для полного примера обратитесь к Примеру загрузки файла Spring.
39. Как проверить данные формы в Spring Web MVC Framework?
Spring поддерживает аннотационную валидацию на основе JSR-303, а также предоставляет интерфейс Validator, который мы можем реализовать для создания собственного валидатора. Для использования валидации на основе JSR-303 нам нужно помечать переменные бина необходимыми валидациями.
Для реализации собственного валидатора необходимо его сконфигурировать в классе контроллера. Для полного примера ознакомьтесь с Пример валидации формы Spring MVC.
40. Что такое перехватчик Spring MVC и как его использовать?
Перехватчики Spring MVC похожи на фильтры Servlet и позволяют перехватывать запросы клиента и обрабатывать их. Мы можем перехватывать запросы клиента в трех местах – preHandle, postHandle и afterCompletion.
Мы можем создать перехватчик Spring, реализовав интерфейс HandlerInterceptor или расширив абстрактный класс HandlerInterceptorAdapter.
Нам необходимо настроить перехватчики в файле конфигурации бинов Spring. Можем определить перехватчик для перехвата всех запросов клиента или настроить его для конкретного сопоставления URI. Для подробного примера обратитесь к Примеру перехватчика Spring MVC.
41. Что такое класс Spring JdbcTemplate и как его использовать?
Spring Framework обеспечивает отличную интеграцию с API JDBC и предоставляет утилитарный класс JdbcTemplate, который мы можем использовать для избежания повторяющегося кода в логике наших операций с базой данных, таких как открытие/закрытие соединения, ResultSet, PreparedStatement и т.д.
Для примера использования JdbcTemplate обратитесь к Примеру Spring JDBC.
42. Как использовать источник данных Tomcat JNDI в веб-приложении Spring?
Для использования настроенного источника данных JNDI в контейнере сервлетов необходимо настроить его в файле конфигурации бина Spring и затем внедрить его в бины Spring в качестве зависимостей. Затем мы можем использовать его с помощью JdbcTemplate
для выполнения операций с базой данных.
<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>
Для полного примера обратитесь к Примеру Spring Tomcat JNDI.
43. Как вы осуществляете управление транзакциями в Spring?
Spring Framework предоставляет поддержку управления транзакциями через декларативное управление транзакциями и программное управление транзакциями. Декларативное управление транзакциями наиболее широко используется, потому что оно легко в использовании и работает в большинстве случаев.
Мы аннотируем метод аннотацией @Transactional
для декларативного управления транзакциями. Нам также необходимо настроить менеджер транзакций для источника данных в файле конфигурации бинов Spring.
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
44. Что такое Spring DAO?
Spring DAO поддерживает работу с технологиями доступа к данным, такими как JDBC, Hibernate, в последовательном и простом способе. Например, у нас есть JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport и JpaDaoSupport для соответствующих технологий.
Spring DAO также обеспечивает последовательность в иерархии исключений, и нам не нужно перехватывать конкретные исключения.
45. Как интегрировать Spring и Hibernate Frameworks?
Мы можем использовать модуль Spring ORM для интеграции фреймворков Spring и Hibernate, если вы используете Hibernate 3+, где SessionFactory предоставляет текущую сессию, тогда вам следует избегать использования классов HibernateTemplate или HibernateDaoSupport и лучше использовать шаблон DAO с инъекцией зависимостей для интеграции.
Spring ORM предоставляет поддержку использования декларативного управления транзакциями Spring, поэтому вам следует использовать это, а не писать код управления транзакциями Hibernate вручную.
Для лучшего понимания вы можете ознакомиться с следующими учебными пособиями:
46. Что такое Spring Security?
Фреймворк Spring Security сосредотачивается на обеспечении аутентификации и авторизации в приложениях на Java. Он также заботится о большинстве общих уязвимостей безопасности, таких как атака CSRF.
Использование Spring Security в веб-приложениях очень выгодно и удобно благодаря использованию аннотаций, таких как @EnableWebSecurity
. Для изучения использования фреймворка Spring Security рекомендуется прочитать следующие публикации.
47. Как внедрить java.util.Properties в бин Spring?
Необходимо определить бин propertyConfigurer, который загрузит свойства из указанного файла свойств. Затем мы можем использовать поддержку Spring EL для внедрения свойств в зависимости других бинов. Например:
<bean id="propertyConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="/WEB-INF/application.properties" />
</bean>
<bean class="com.journaldev.spring.EmployeeDaoImpl">
<property name="maxReadResults" value="${results.read.max}"/>
</bean>
Если вы используете аннотации для конфигурации бинов Spring, то вы можете внедрить свойство следующим образом.
@Value("${maxReadResults}")
private int maxReadResults;
48. Назовите некоторые шаблоны проектирования, используемые в Spring Framework?
Spring Framework использует множество шаблонов проектирования, некоторые из распространенных включают в себя:
- Паттерн Одиночка: Создание бинов с областью по умолчанию.
- Фабричный метод: Классы фабрик бинов
- Прототип: Области видимости бинов
- Паттерн Адаптер: Spring Web и Spring MVC
- Паттерн Заместитель: Поддержка аспектно-ориентированного программирования Spring
- Паттерн Шаблонный метод: JdbcTemplate, HibernateTemplate и т. д.
- Фронт-контроллер: Диспетчер сервлетов Spring MVC
- Объект доступа к данным: поддержка Spring DAO
- Внедрение зависимостей и аспектно-ориентированное программирование
49. Какие некоторые из лучших практик для Spring Framework?
Некоторые из лучших практик для Spring Framework включают:
- Избегайте указания номеров версий в ссылках на схему, чтобы убедиться, что у нас есть последние конфигурации.
- Разделите конфигурации бинов Spring на основе их задач, например, spring-jdbc.xml, spring-security.xml.
- Для бинов Spring, которые используются в нескольких контекстах в Spring MVC, создавайте их в корневом контексте и инициализируйте с помощью слушателя.
- Конфигурируйте зависимости бинов настолько, насколько это возможно, старайтесь избегать автосвязывания насколько это возможно.
- Для свойств на уровне приложения лучший подход – создать файл свойств и считать его в файле конфигурации бина Spring.
- Для меньших приложений аннотации полезны, но для больших приложений аннотации могут стать проблемой. Если у нас есть всю конфигурацию в файлах XML, ее обслуживание будет проще.
- Используйте правильные аннотации для компонентов, чтобы легче было понять их назначение. Для служб используйте @Service, а для объектов DAO используйте @Repository.
- У Spring Framework есть много модулей, используйте то, что вам нужно. Удалите все дополнительные зависимости, которые обычно добавляются при создании проектов через шаблоны Spring Tool Suite.
- Если вы используете аспекты, убедитесь, что точка соединения остается как можно более узкой, чтобы избежать советов по ненужным методам. Рассмотрите использование пользовательских аннотаций, которые легче использовать и избегайте любых проблем.
- Используйте внедрение зависимостей, когда это действительно целесообразно; просто ради слабой связанности не используйте его, потому что это труднее поддерживать.
Что такое Spring Boot?
Spring Boot делает фреймворк Spring уникальным. Он предоставляет нам простой способ создания различных типов приложений на Java и их привязки к среде выполнения контейнера сервлетов. Таким образом, мы получаем один файл JAR, который можно запустить для выполнения проекта. Это позволяет нам сэкономить много времени при получении каркасного проекта, который готов к развертыванию продукта очень быстро. Таким образом, мы можем сосредоточиться больше на бизнес-логике, а не тратить время на обычный процесс сборки кода, а затем его развертывание на контейнере сервлетов. Поскольку это очень обширная тема, я бы порекомендовал вам ознакомиться с Вопросами на собеседовании по Spring Boot.
Это все вопросы для интервью по Spring Framework. Надеюсь, эти вопросы помогут вам на предстоящем собеседовании по Java EE. Я буду продолжать добавлять больше вопросов в список, как только найду их. Если у вас есть еще вопросы, которые должны быть включены в список, обязательно добавьте комментарий к ним, и я их добавлю.
Source:
https://www.digitalocean.com/community/tutorials/spring-interview-questions-and-answers