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

Что лучше: web.xml или Initializer класс использовать со Spring?

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

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

В этой статье мы рассмотрим три разных подхода к настройке DispatcherServlet , доступных в последних версиях Spring Framework:

  1. Мы начнем с конфигурации XML и файла web.xml .
  2. Затем мы перенесем объявление сервлета из файла web.xml в конфигурацию Java, но оставим любую другую конфигурацию в XML.
  3. Наконец, на третьем и последнем шаге рефакторинга у нас будет проект, на 100% настроенный на Java.

2. ДиспетчерСервлет

Одной из основных концепций Spring MVC является DispatcherServlet . Документация Spring определяет его как:

Центральный диспетчер для обработчиков/контроллеров HTTP-запросов, например, для контроллеров веб-интерфейса или экспортеров удаленных сервисов на основе HTTP. Отправляет зарегистрированным обработчикам для обработки веб-запроса, предоставляя удобные средства сопоставления и обработки исключений.

По сути, DispatcherServlet является точкой входа каждого приложения Spring MVC . Его цель — перехватывать HTTP -запросы и направлять их нужному компоненту, который знает, как с ними обращаться.

3. Конфигурация с помощью web.xml ``

Если вы имеете дело с устаревшими проектами Spring , очень часто можно найти XML -конфигурацию, и до Spring 3.1 единственным способом настройки DispatcherServlet был файл WEB-INF/web.xml . В этом случае необходимо выполнить два шага.

Давайте посмотрим на пример конфигурации — первый шаг — это объявление сервлета:

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

С помощью этого блока XML мы объявляем сервлет, который:

  1. Называется " диспетчер "
  2. Является экземпляром org.springframework.web.servlet.DispatcherServlet.
  3. Будет инициализирован параметром с именем contextConfigLocation , который содержит путь к XML -файлу конфигурации. ``

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

Теперь наш сервлет настроен. Второй шаг — объявление servlet-mapping :

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

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

4. Гибридная конфигурация

С принятием API-интерфейсов сервлетов версии 3.0 файл web.xml стал необязательным, и теперь мы можем использовать Java для настройки DispatcherServlet .

Мы можем зарегистрировать сервлет, реализующий WebApplicationInitializer . Это эквивалент приведенной выше конфигурации XML :

public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}

В этом примере мы:

  1. Реализация интерфейса WebApplicationInitializer
  2. Переопределяя метод onStartup , мы создаем новый XmlWebApplicationContext , настроенный с тем же файлом, который передается как contextConfigLocation сервлету в примере XML .
  3. Затем мы создаем экземпляр DispatcherServlet с новым контекстом, который мы только что создали .
  4. И, наконец, мы регистрируем сервлет с шаблоном сопоставления URL . ``

Поэтому мы использовали Java для объявления сервлета и привязки его к отображению URL -адресов , но сохранили конфигурацию в отдельном XML - файле: dispatcher-config.xml .

5. 100% конфигурация Java

При таком подходе наш сервлет объявлен на Java , но для его настройки нам по-прежнему нужен XML -файл. С помощью WebApplicationInitializer вы можете достичь 100% конфигурации Java .

Давайте посмотрим, как мы можем реорганизовать предыдущий пример.

Первое, что нам нужно сделать, это создать контекст приложения для сервлета.

На этот раз мы будем использовать контекст, основанный на аннотациях, чтобы мы могли использовать Java и аннотации для конфигурации и устранить необходимость в XML - файлах, таких как dispatcher-config.xml :

AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();

Затем этот тип контекста можно настроить, зарегистрировав класс конфигурации:

context.register(AppConfig.class);

Или установка всего пакета, который будет сканироваться на классы конфигурации:

context.setConfigLocation("com.example.app.config");

Теперь, когда контекст нашего приложения создан, мы можем добавить прослушиватель в ServletContext , который будет загружать контекст:

container.addListener(new ContextLoaderListener(context));

Следующий шаг — создание и регистрация нашего диспетчерского сервлета:

ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");

Теперь наш WebApplicationInitializer должен выглядеть так:

public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.example.app.config");

container.addListener(new ContextLoaderListener(context));

ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}

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

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

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

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

Исходный код из этой статьи вы можете найти на Github здесь и здесь .