Поиск по сайту:

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


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

Внедрение зависимостей и аспектно-ориентированное программирование лежат в основе среды Spring. Если вы хорошо разбираетесь в Spring Framework, шансы быть выбранным на собеседовании по Java очень высоки.

Совет для профессионалов: статьи с вопросами о собеседовании по Java.

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

Здесь я привожу почти 50 вопросов весеннего интервью и ответы на них. Он обновлен до Spring 5, поэтому он охватывает все последние функции, такие как Spring WebFlux для реактивного программирования.

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

Spring — одна из наиболее широко используемых сред Java EE. Основными понятиями Spring Framework являются «Внедрение зависимостей» и «Аспектно-ориентированное программирование».

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

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

Рекомендуем прочитать: Spring Framework

2. Каковы некоторые важные особенности Spring Framework?

Spring Framework построен на основе двух концепций дизайна — внедрения зависимостей и аспектно-ориентированного программирования.

Некоторые особенности Spring Framework:

  • Легкий и очень маленький накладные расходы на использование платформы для нашей разработки.
  • Внедрение зависимостей или инверсия управления для записи компонентов, которые не зависят друг от друга, контейнер Spring позаботится о том, чтобы связать их вместе для выполнения нашей работы.
  • Контейнер Spring IoC управляет жизненным циклом Spring Bean и специфичными для проекта конфигурациями, такими как поиск JNDI.
  • Инфраструктура Spring MVC может использоваться для создания веб-приложений, а также веб-сервисов для отдыха, способных возвращать XML, а также ответ JSON.
  • Поддержка управления транзакциями, операций JDBC, загрузки файлов, обработки исключений и т. д. с очень небольшим количеством конфигураций, либо с использованием аннотаций, либо с помощью файла конфигурации bean-компонента Spring.

3. В чем преимущество использования Spring Framework?

Некоторые из преимуществ использования Spring Framework:

  • Уменьшение прямых зависимостей между различными компонентами приложения. Контейнер Spring IoC отвечает за инициализацию ресурсов или bean-компонентов и внедрение их в качестве зависимостей.
  • В среде Spring легко писать примеры модульных тестов, потому что наша бизнес-логика не имеет прямых зависимостей с реальными классами реализации ресурсов. Мы можем легко написать тестовую конфигурацию и внедрить наши фиктивные компоненты для целей тестирования.
  • Уменьшает объем шаблонного кода, такого как инициализация объектов, открытие/закрытие ресурсов. Мне очень нравится класс JdbcTemplate, потому что он помогает нам удалить весь шаблонный код, который поставляется с программированием JDBC.
  • Среда Spring разделена на несколько модулей, что помогает нам поддерживать легкость нашего приложения. Например, если нам не нужны функции управления транзакциями Spring, нам не нужно добавлять эту зависимость в наш проект.
  • Среда Spring поддерживает большинство функций Java EE и многое другое. Он всегда находится на вершине новых технологий, например, есть проект Spring для Android, который помогает нам писать лучший код для нативных приложений Android. Это делает структуру Spring полным пакетом, и нам не нужно заботиться о разных платформах для разных требований.

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, а не сканирование путей к классам.

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

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

Spring WebFlux — это новый модуль, представленный в Spring 5. Spring WebFlux — это первый шаг к модели реактивного программирования в среде Spring.

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

Вы можете узнать больше об этом в учебном пособии по Spring WebFlux.

6. Что вы понимаете под внедрением зависимостей?

Шаблон проектирования Dependency Injection позволяет нам удалить жестко закодированные зависимости и сделать наше приложение слабо связанным, расширяемым и удобным в сопровождении. Мы можем реализовать шаблон внедрения зависимостей, чтобы перенести разрешение зависимостей со времени компиляции на время выполнения.

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

Узнайте больше в Google Guice об внедрении зависимостей, чтобы автоматизировать процесс внедрения зависимостей. Но в большинстве случаев мы ищем больше, чем просто внедрение зависимостей, и именно здесь Spring выходит на первое место.

7. Как мы реализуем DI в Spring Framework?

Мы можем использовать конфигурацию на основе Spring XML, а также конфигурацию на основе аннотаций для реализации DI в приложениях Spring. Для лучшего понимания, пожалуйста, прочитайте пример Spring Dependency Injection, где вы можете изучить оба способа с тестовым примером JUnit. Пост также содержит пример zip-файла проекта, который вы можете загрузить и поиграть, чтобы узнать больше.

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

Мы можем установить плагины в Eclipse, чтобы получить все возможности Spring Tool Suite. Тем не менее, STS поставляется с Eclipse с некоторыми другими важными вещами, такими как поддержка Maven, шаблоны для создания различных типов проектов Spring и сервер tc для повышения производительности с приложениями Spring.

Мне нравится STS, потому что он выделяет компоненты Spring, и если вы используете точки и советы АОП, то он ясно показывает, какие методы будут подпадать под конкретную точку. Поэтому вместо того, чтобы устанавливать все самостоятельно, я предпочитаю использовать STS при разработке приложений на основе Spring.

9. Назовите некоторые важные модули Spring?

Некоторые из важных модулей Spring Framework:

  • Spring Context — для внедрения зависимостей.
  • Spring AOP — для аспектно-ориентированного программирования.
  • Spring DAO — для операций с базой данных с использованием шаблона DAO
  • Spring JDBC — для поддержки JDBC и DataSource.
  • Spring ORM — для поддержки инструментов ORM, таких как Hibernate
  • Веб-модуль Spring — для создания веб-приложений.
  • Spring MVC — реализация модели-представления-контроллера для создания веб-приложений, веб-сервисов и т. д.

10. Что вы понимаете под аспектно-ориентированным программированием?

Корпоративные приложения имеют некоторые общие сквозные задачи, которые применимы к различным типам объектов и модулей приложений, например, ведение журнала, управление транзакциями, проверка данных, аутентификация и т. д. Модульность приложения достигается с помощью классов в объектно-ориентированном программировании. В АОП модульность приложения достигается с помощью Аспектов, и они настроены так, чтобы пересекаться с различными методами класса.

АОП устраняет прямую зависимость сквозных задач от классов, что невозможно в обычном объектно-ориентированном программировании. Например, у нас может быть отдельный класс для логирования, но другие классы должны будут вызывать эти методы. Но в АОП мы настраиваем аспекты, и выполнение метода происходит автоматически. Узнайте больше о поддержке Spring AOP в примере Spring AOP.

11. Что такое Aspect, Advice, Pointcut, JointPoint и Advice Arguments в АОП?

Аспект: Аспект — это класс, который реализует сквозные задачи, такие как управление транзакциями. Аспекты могут быть настроены обычным классом, а затем настроены в файле конфигурации Spring Bean, или мы можем использовать поддержку Spring AspectJ для объявления класса как Aspect с помощью аннотации @Aspect.

Совет: Совет — это действие, предпринятое для конкретной точки соединения. С точки зрения программирования, это методы, которые выполняются, когда в приложении достигается определенная точка соединения с соответствующим pointcut. Вы можете думать о Advice как о фильтрах сервлетов.

Pointcut: Pointcut — это регулярные выражения, которые сопоставляются с точками соединения, чтобы определить, нужно ли выполнять совет или нет. Pointcut использует различные виды выражений, которые сопоставляются с точками соединения. Платформа Spring использует язык выражений AspectJ pointcut для определения точек соединения, в которых будут применяться советы.

JoinPoint: точка соединения — это конкретная точка в приложении, такая как выполнение метода, обработка исключений, изменение значений переменных объекта и т. д. В Spring AOP точка соединения — это всегда выполнение метода.

Аргументы совета: мы можем передавать аргументы в методах совета. Мы можем использовать выражение args() в pointcut для применения к любому методу, соответствующему шаблону аргумента. Если мы используем это, то нам нужно использовать то же имя в методе совета, из которого определяется тип аргумента.

Эти понятия поначалу кажутся запутанными, но если вы ознакомитесь с Spring Aspect, Advice Example, то сможете легко понять их.

12. В чем разница между Spring AOP и AspectJ AOP?

AspectJ — это стандартная реализация аспектно-ориентированного программирования, тогда как Spring в некоторых случаях реализует АОП. Основные различия между Spring AOP и AspectJ:

  • Spring AOP проще в использовании, чем AspectJ, потому что нам не нужно беспокоиться о процессе плетения.
  • Spring AOP поддерживает аннотации AspectJ, поэтому, если вы знакомы с AspectJ, вам будет проще работать с Spring AOP.
  • Spring AOP поддерживает только AOP на основе прокси-сервера, поэтому его можно применять только к точкам соединения выполнения метода. AspectJ поддерживает все виды точечных сокращений.
  • Один из недостатков Spring AOP заключается в том, что его можно применять только к bean-компонентам, созданным с помощью Spring Context.

13. Что такое контейнер Spring IoC?

Инверсия управления (IoC) — это механизм для достижения слабой связи между зависимостями объекта. Для достижения слабой связи и динамического связывания объектов во время выполнения объекты определяют свои зависимости, которые внедряются другими объектами ассемблера. Контейнер Spring IoC — это программа, которая внедряет зависимости в объект и делает его готовым для использования.

Контейнерные классы Spring Framework IoC являются частью пакетов org.springframework.beans и org.springframework.context и предоставляют нам различные способы разделения зависимостей объектов.

Вот некоторые из полезных реализаций ApplicationContext, которые мы используем;

  • AnnotationConfigApplicationContext: для автономных приложений Java, использующих конфигурацию на основе аннотаций.
  • ClassPathXmlApplicationContext: для автономных приложений Java, использующих конфигурацию на основе XML.
  • FileSystemXmlApplicationContext: аналогичен ClassPathXmlApplicationContext, за исключением того, что файл конфигурации XML можно загрузить из любой точки файловой системы.
  • AnnotationConfigWebApplicationContext и XmlWebApplicationContext для веб-приложений.

14. Что такое Spring Bean?

Любой обычный класс Java, который инициализируется контейнером Spring IoC, называется Spring Bean. Мы используем Spring ApplicationContext для получения экземпляра Spring Bean.

Контейнер Spring IoC управляет жизненным циклом Spring Bean, областями действия bean-компонента и внедрением любых необходимых зависимостей в bean-компонент.

15. Какова важность файла конфигурации bean-компонента Spring?

Мы используем файл конфигурации Spring Bean для определения всех bean-компонентов, которые будут инициализированы Spring Context. Когда мы создаем экземпляр Spring ApplicationContext, он считывает XML-файл Spring bean и инициализирует их все. После инициализации контекста мы можем использовать его для получения различных экземпляров компонента.

Помимо конфигурации Spring Bean, этот файл также содержит перехватчики Spring MVC, преобразователи представлений и другие элементы для поддержки конфигураций на основе аннотаций.

16. Какие есть способы настроить класс как Spring Bean?

Существует три различных способа настройки Spring Bean.

Конфигурация XML: это самая популярная конфигурация, и мы можем использовать элемент bean-компонента в файле контекста для настройки Spring Bean. Например:

<bean name="myBean" class="com.journaldev.spring.beans.MyBean"></bean>

Конфигурация на основе Java: если вы используете только аннотации, вы можете настроить bean-компонент Spring с помощью аннотации @Bean. Эта аннотация используется с классами @Configuration для настройки компонента Spring. Пример конфигурации:

@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);

Конфигурация на основе аннотаций: мы также можем использовать аннотации @Controller с классами, чтобы настроить их как Spring bean. Для этого нам нужно будет указать местоположение базового пакета для сканирования этих классов. Например:

<context:component-scan base-package="com.journaldev.spring" />

17. Каковы различные области действия Spring Bean?

Для Spring Beans определено пять областей.

  1. singleton: для каждого контейнера будет создан только один экземпляр компонента. Это область действия по умолчанию для spring bean-компонентов. При использовании этой области убедитесь, что у Spring Bean нет общих переменных экземпляра, иначе это может привести к проблемам с несогласованностью данных, поскольку он не является потокобезопасным.
  2. прототип: каждый раз при запросе компонента будет создаваться новый экземпляр.
  3. запрос: это то же самое, что и область действия прототипа, однако она предназначена для использования в веб-приложениях. Для каждого HTTP-запроса будет создаваться новый экземпляр компонента.
  4. session: новый компонент будет создаваться контейнером для каждого HTTP-сеанса.
  5. global-session: используется для создания глобальных сеансовых компонентов для приложений с портлетами.

Spring Framework является расширяемым, и мы также можем создавать свои собственные области видимости. Но в большинстве случаев мы хорошо справляемся с областями действия, предоставляемыми фреймворком. Чтобы установить области действия компонента Spring, мы можем использовать атрибут \scope в элементе компонента или аннотацию @Scope для конфигураций на основе аннотаций.

18. Каков жизненный цикл Spring Bean?

Spring Beans инициализируется Spring Container, и все зависимости также внедряются. Когда контекст уничтожается, он также уничтожает все инициализированные компоненты. В большинстве случаев это хорошо работает, но иногда мы хотим инициализировать другие ресурсы или выполнить некоторую проверку, прежде чем сделать наши компоненты готовыми к использованию. Платформа Spring обеспечивает поддержку методов пост-инициализации и предварительного уничтожения в bean-компонентах Spring.

Мы можем сделать это двумя способами — реализуя интерфейсы InitializingBean и DisposableBean или используя атрибуты init-method и destroy-method в конфигурациях bean-компонентов Spring. Для получения более подробной информации, пожалуйста, прочитайте Методы жизненного цикла Spring Bean.

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

Есть два способа получить конкретные объекты Container в bean-компоненте Spring.

  • Реализация интерфейсов Spring *Aware, для этих интерфейсов ServletContextAware и ServletConfigAware, полный пример этих интерфейсов см. в разделе Spring Aware Interfaces.
  • Использование аннотации @Autowired с переменной компонента типа ServletContext и ServletConfig. Они будут работать только в средах, специфичных для контейнеров сервлетов.

@Autowired
ServletContext servletContext;

20. Что такое подключение Bean и аннотация @Autowired?

Процесс внедрения зависимостей Spring Bean во время инициализации называется Spring Bean Wiring.

Обычно лучше всего выполнять явное связывание всех зависимостей bean-компонентов, но среда Spring также поддерживает автоматическое связывание. Мы можем использовать аннотацию @Autowired с полями или методами для автоматического связывания по типу. Чтобы эта аннотация работала, нам также необходимо включить конфигурацию на основе аннотаций в файле конфигурации bean-компонента Spring. Это можно сделать с помощью элемента context:annotation-config.

Дополнительные сведения об аннотации @Autowired см. в разделе Spring Autowire Example.

21. Какие существуют типы автосвязывания Spring Bean?

В среде Spring существует четыре типа автоматического подключения.

  1. автоподключение по имени
  2. автоподключение по типу
  3. автоматическое связывание конструктором
  4. автоматическое связывание с помощью аннотаций @Qualifier

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

22. Обеспечивает ли Spring Bean потокобезопасность?

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

Однако мы можем изменить область действия bean-компонента Spring на запрос, прототип или сеанс, чтобы обеспечить потокобезопасность за счет производительности. Это проектное решение, основанное на требованиях проекта.

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

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

Класс Controller отвечает за обработку различных типов клиентских запросов на основе сопоставлений запросов. Мы можем создать класс контроллера, используя аннотацию @RequestMapping, чтобы определить методы обработчика для конкретного сопоставления URI.

24. В чем разница между аннотациями @Component, @Controller, @Repository и @Service в Spring?

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

@Controller — это особый тип компонента, используемый в приложениях MVC и в основном используемый с аннотацией RequestMapping.

Аннотация @Repository используется для указания того, что компонент используется в качестве репозитория и механизма для хранения/извлечения/поиска данных. Мы можем применить эту аннотацию к классам реализации шаблона DAO.

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

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

25. Что такое DispatcherServlet и ContextLoaderListener?

DispatcherServlet — это передний контроллер в приложении Spring MVC, он загружает файл конфигурации bean-компонентов Spring и инициализирует все настроенные bean-компоненты. Если аннотации включены, он также сканирует пакеты и настраивает любой bean-компонент, аннотированный аннотациями @Service.

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

26. Что такое ViewResolver в Spring?

Реализации ViewResolver используются для разрешения страниц просмотра по имени. Мы настраиваем его в файле конфигурации bean-компонента spring. Например:

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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, и мы предоставляем каталог страниц просмотра и местоположение суффикса через свойства компонента. Таким образом, если метод обработчика контроллера возвращает «домой», преобразователь представления будет использовать страницу представления, расположенную по адресу /WEB-INF/views/home.jsp.

27. Что такое MultipartResolver и когда он используется?

Интерфейс MultipartResolver используется для загрузки файлов — CommonsMultipartResolver и StandardServletMultipartResolver — это две реализации, предоставляемые Spring Framework для загрузки файлов. По умолчанию составные преобразователи не настроены, но чтобы использовать их для загрузки файлов, все, что нам нужно, это определить bean-компонент с именем «multipartResolver» с типом MultipartResolver в конфигурациях bean-компонентов spring.

После настройки любой составной запрос будет разрешен сконфигурированным MultipartResolver и передан обернутому HttpServletRequest. Затем он используется в классе контроллера для получения файла и его обработки. Полный пример см. в разделе Пример загрузки файла Spring MVC.

28. Как обрабатывать исключения в Spring MVC Framework?

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

На основе контроллера — мы можем определить методы обработчика исключений в наших классах контроллеров. Все, что нам нужно, это аннотировать эти методы аннотацией @ExceptionHandler.

Глобальный обработчик исключений. Обработка исключений является сквозной задачей, и Spring предоставляет аннотацию @ControllerAdvice, которую мы можем использовать с любым классом для определения нашего глобального обработчика исключений.

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

Полный пример см. в разделе Пример обработки исключений Spring.

29. Как создать ApplicationContext в Java-программе?

Существуют следующие способы создания контекста Spring в отдельной Java-программе.

  1. AnnotationConfigApplicationContext: если мы используем Spring в автономных приложениях Java и используем аннотации для конфигурации, мы можем использовать это для инициализации контейнера и получения объектов bean.
  2. ClassPathXmlApplicationContext: если у нас есть XML-файл конфигурации bean-компонента Spring в автономном приложении, мы можем использовать этот класс для загрузки файла и получения объекта-контейнера.
  3. 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>

Другой вариант — использовать элемент импорта в файле конфигурации контекста для импорта других конфигураций, например:

<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 для определения bean-компонентов. Если используются аннотации, его необходимо настроить здесь. Кроме того, нам нужно настроить преобразователь представления для страниц просмотра.
  • Класс контроллера с сопоставлениями запросов, определенными для обработки клиентских запросов.

Вышеуказанных шагов должно быть достаточно для создания простого приложения Spring MVC Hello World.

33. Как бы вы связали Spring MVC Framework с архитектурой MVC?

Как следует из названия, Spring MVC построен на основе архитектуры Model-View-Controller. DispatcherServlet — это передний контроллер в приложении Spring MVC, который обрабатывает все входящие запросы и делегирует их различным методам обработчика контроллера.

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

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

34. Как добиться локализации в приложениях Spring MVC?

Spring обеспечивает отличную поддержку локализации или i18n через пакеты ресурсов. Основные шаги, необходимые для локализации нашего приложения:

  • Создание пакетов ресурсов сообщений для разных языков, например messages_en.properties, messages_fr.properties и т. д.
  • Определение компонента messageSource в файле конфигурации компонента spring типа ResourceBundleMessageSource или ReloadableResourceBundleMessageSource.
  • Для поддержки изменения локали определите bean-компонент 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 Framework для создания веб-сервисов Restful, которые возвращают данные JSON. Spring обеспечивает интеграцию с API-интерфейсом Jackson JSON, который мы можем использовать для отправки ответов JSON в веб-сервисе для отдыха.

Нам нужно будет выполнить следующие шаги, чтобы настроить наше приложение 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. Настройте bean-компонент RequestMappingHandlerAdapter в файле конфигурации bean-компонента spring и установите для свойства конвертеров сообщений значение bean-компонента MappingJackson2HttpMessageConverter. Примерная конфигурация будет:

<!-- Configure to plugin JSON as request and response in method handler -->
<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>
     
<!-- Configure bean to convert JSON to POJO and vice versa -->
<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. Вы можете вызвать остальную службу через любой API, но если вы хотите использовать Spring, вы можете легко сделать это с помощью класса RestTemplate.

Полный пример см. в разделе Пример Spring Restful Webservice.

36. Какие важные аннотации Spring вы использовали?

Вот некоторые из аннотаций Spring, которые я использовал в своем проекте:

  • @Controller — для классов контроллеров в проекте Spring MVC.
  • Примеры аннотаций Spring MVC RequestMapping
  • @ResponseBody — для отправки Object в качестве ответа, обычно для отправки данных XML или JSON в качестве ответа.
  • @PathVariable — для сопоставления динамических значений из URI с аргументами метода обработчика.
  • @Autowired — для автоматического связывания зависимостей в bean-компонентах Spring.
  • Аннотация @Autowired во избежание путаницы при наличии нескольких экземпляров типа компонента.
  • @Service — для классов обслуживания.
  • @Scope — для настройки области действия Spring bean.
  • @Bean — для конфигураций на основе Java.
  • Аннотации AspectJ для настройки аспектов и советов, @Pointcut и т. д.

37. Можем ли мы отправить объект в качестве ответа метода обработчика контроллера?

Да, можем, используя аннотацию @ResponseBody. Вот как мы отправляем ответ на основе JSON или XML в спокойных веб-сервисах.

38. Как загружать файлы в приложение Spring MVC?

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

39. Как проверить данные формы в Spring Web MVC Framework?

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

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

40. Что такое Spring MVC Interceptor и как его использовать?

Перехватчики Spring MVC похожи на фильтры сервлетов и позволяют нам перехватывать клиентские запросы и обрабатывать их. Мы можем перехватывать клиентские запросы в трех местах — preHandle, postHandle и afterCompletion.

Мы можем создать перехватчик Spring, реализовав интерфейс HandlerInterceptor или расширив абстрактный класс HandlerInterceptorAdapter.

Нам нужно настроить перехватчики в файле конфигурации bean-компонента Spring. Мы можем определить перехватчик для перехвата всех клиентских запросов или настроить его для определенного сопоставления URI. Подробный пример см. в разделе Пример перехватчика Spring MVC.

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

Spring Framework обеспечивает превосходную интеграцию с JDBC API и предоставляет служебный класс JdbcTemplate, который мы можем использовать, чтобы избежать ненужного кода из нашей логики операций с базой данных, такой как Opening/Closing Connection, ResultSet, PreparedStatement и т. д.

Пример JdbcTemplate см. в примере Spring JDBC.

42. Как использовать Tomcat JNDI DataSource в веб-приложении Spring?

Для использования контейнера сервлета, настроенного JNDI DataSource, нам нужно настроить его в файле конфигурации bean-компонента Spring, а затем внедрить его в bean-компоненты 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 обеспечивает поддержку управления транзакциями посредством декларативного управления транзакциями, а также программного управления транзакциями. Декларативное управление транзакциями используется наиболее широко, потому что оно простое в использовании и работает в большинстве случаев.

Мы используем метод annotate с аннотацией @Transactional для декларативного управления транзакциями. Нам нужно настроить диспетчер транзакций для DataSource в файле конфигурации bean-компонента 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 Framework?

Мы можем использовать модуль Spring ORM для интеграции фреймворков Spring и Hibernate, если вы используете Hibernate 3+, где SessionFactory предоставляет текущий сеанс, тогда вам следует избегать использования классов HibernateTemplate или HibernateDaoSupport и лучше использовать шаблон DAO с внедрением зависимостей для интеграции.

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

Для лучшего понимания вам следует пройти следующие уроки:

  • Пример интеграции Spring Hibernate
  • Пример интеграции Spring MVC Hibernate

46. Что такое Spring Security?

Фреймворк безопасности Spring фокусируется на обеспечении как аутентификации, так и авторизации в java-приложениях. Он также позаботится о большинстве распространенных уязвимостей безопасности, таких как CSRF-атака.

Безопасность Spring очень полезна и проста в использовании в веб-приложениях благодаря использованию аннотаций, таких как @EnableWebSecurity. Вам следует просмотреть следующие сообщения, чтобы узнать, как использовать среду Spring Security.

  • Spring Security в веб-приложении сервлетов
  • Пример интеграции Spring MVC и Spring Security

47. Как внедрить java.util.Properties в Spring Bean?

Мы должны определить bean-компонент 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 использует множество шаблонов проектирования, вот некоторые из наиболее распространенных:

  1. Singleton Pattern: создание bean-компонентов с областью действия по умолчанию.
  2. Шаблон Factory: классы Bean Factory
  3. Шаблон прототипа: области действия компонента
  4. Шаблон адаптера: Spring Web и Spring MVC
  5. Шаблон прокси: поддержка аспектно-ориентированного программирования Spring
  6. Шаблон метода шаблона: JdbcTemplate, HibernateTemplate и т. д.
  7. Фронтальный контроллер: Spring MVC DispatcherServlet
  8. Объект доступа к данным: поддержка Spring DAO
  9. Внедрение зависимостей и аспектно-ориентированное программирование

49. Каковы некоторые из лучших практик для Spring Framework?

Некоторые из лучших практик для Spring Framework:

  • Не указывайте номера версий в справочнике по схеме, чтобы убедиться, что у нас самые последние конфигурации.
  • Разделите конфигурации bean-компонентов Spring на основе их проблем, таких как spring-jdbc.xml, spring-security.xml.
  • Для Spring bean-компонентов, которые используются в нескольких контекстах в Spring MVC, создайте их в корневом контексте и инициализируйте с прослушивателем.
  • Максимально настройте зависимости bean-компонентов, старайтесь избегать автоматического связывания, насколько это возможно.
  • Для свойств уровня приложения лучше всего создать файл свойств и прочитать его в файле конфигурации bean-компонента Spring.
  • Для небольших приложений аннотации полезны, но для более крупных приложений аннотации могут стать проблемой. Если у нас есть вся конфигурация в файлах XML, поддерживать ее будет проще.
  • Используйте правильные аннотации для компонентов, чтобы легко понять их назначение. Для сервисов используйте @Repository.
  • Среда Spring имеет множество модулей, используйте то, что вам нужно. Удалите все дополнительные зависимости, которые обычно добавляются при создании проектов с помощью шаблонов Spring Tool Suite.
  • Если вы используете Аспекты, постарайтесь сделать точку соединения как можно более узкой, чтобы избежать советов о нежелательных методах. Подумайте о пользовательских аннотациях, которые проще использовать и избежать каких-либо проблем.
  • Используйте внедрение зависимостей, когда есть реальная выгода, только ради слабой связи, не используйте его, потому что его сложнее поддерживать.

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

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

Это все вопросы интервью по Spring Framework. Я надеюсь, что эти вопросы помогут вам в предстоящем интервью по Java EE. Я буду продолжать добавлять новые вопросы в список, как только найду их. Если вы знаете еще несколько вопросов, которые должны быть частью списка, не забудьте добавить к ним комментарий, и я включу его.