Статьи

Весенняя 3.2 сладость

Даже самые крайние противники 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.

Чтобы идти дальше:

  • Весь набор новых функций доступен здесь

С http://blog.frankel.ch/spring-3-2-sweetness