Даже самые крайние противники Spring должны признать, что все дело в том, чтобы облегчить жизнь разработчикам. Версия 3.2 Spring MVC приносит еще больше сладости к столу.
Сладость № 1: Нет web.xml
Возможность запуска веб-приложения без какого-либо дескриптора веб-развертывания появилась в Servlet 3.0.
Одним из вариантов будет аннотирование вашего сервлета @WebServlet
аннотацией для установки сопоставления и дополнительных данных. Когда вы получаете свой сервлет бесплатно, как у Spring DispatcherServlet
, вам нужно будет создать подкласс вашего сервлета только для добавления аннотаций.
В качестве альтернативы Servlet 3.0 предлагает способ как программно регистрировать сервлеты в контейнере, так и предлагать перехваты при запуске через ServletContainerInitializer
интерфейс. Контейнер будет вызывать onStartup()
метод всей конкретной реализации при запуске веб-приложения. Среда Spring использует эту функцию для создания WebApplicationInitializer
экземпляров.
Spring MVC 3.2 обеспечивает такую реализацию — AbstractContextLoaderInitializer
для программной регистрации DispatcherServlet
. Это означает, что как только jar spring-webmvc окажется в WEB-INF/lib
папке веб-приложения , вы получите готовый сервлет Dispatcher.
Это заменяет как отображение сервлета и сервлета, так и объявления прослушивателя контекста в файле web.xml.
Сладость № 2: Простая интеграция конфигурации Java
Конфигурация Java — это способ явной настройки Spring-инъекций безопасным способом. Я не буду вдаваться в полную демонстрацию этого, как я уже писал об этом некоторое время назад.
Более ранние версии Spring предоставляли способ использовать классы конфигурации Java вместо файлов XML в дескрипторе веб-развертывания. Spring 3.2 предложения AbstractAnnotationConfigDispatcherServletInitializer
, AbstractContextLoaderInitializer
подкласс с крючками для классов конфигурации Java.
Ваш собственный конкретный подкласс должен реализовывать методы для определения отображений сервлета, а также корневые и веб-классы конфигурации Java:
public class SugarSpringWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { JavaConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] { WebConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
На данный момент вам просто нужно создать эти классы конфигурации.
Сладость № 3: интеграционное тестирование на уровне картирования
Ваш код должен быть модульным, то есть изолированным, чтобы гарантировать, что каждый метод не содержит ошибок, и проверенным на интеграцию, чтобы гарантировать, что сотрудничество между классами даст ожидаемые результаты.
До версии 3.2 среда тестирования Spring позволяла достаточно легко собирать ваши классы / файлы конфигурации. Проблема заключалась в том, как вы бы назвали точки входа — контроллеры. Вы можете вызывать методы этих контроллеров, но не сопоставления, оставляя их непроверенными.
В версии 3.2 Spring Test предоставляет целую среду тестирования MVC, точки входа которой являются отображениями. Таким образом, вместо того, чтобы тестировать метод x()
контроллера C
, вы должны протестировать запрос /z
, чтобы Spring MVC обработал его, чтобы мы могли проверить ожидаемые результаты.
Инфраструктура также обеспечивает ожидания для возврата представления, пересылки, перенаправления и установки атрибутов модели, все с помощью определенного DSL:
public class SayHelloControllerIT extends AbstractTestNGSpringContextTests { private MockMvc mockMvc; @BeforeMethod public void setUp() { mockMvc = webAppContextSetup((WebApplicationContext) applicationContext).build(); } @Test(dataProvider = "pathParameterAndExpectedModelValue") public void accessingSayhelloWithSubpathShouldForwardToSayHelloJspWithModelFilled(String path, String value) throws Exception { mockMvc.perform(get("/sayHello/Jo")).andExpect(view().name("sayHello")).andExpect(model().attribute("name", "Jo")); } }
Проект для этой статьи можно скачать в формате Eclipse / Maven.
Чтобы идти дальше:
- Весь набор новых функций доступен здесь