GrabDuck

JavaConfig на примере Spring MVC

:

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

Пример будет достаточно простым. Мы возьмеем уже готовый проект на Spring MVC и переведем его xml конфигурации на Java классы.

Для начало вам следует просмотреть этот урок Spring 3. MVC — Hello world так как на его основе бы и будем делать наш урок.

 

Шаг 0. Зависимости

Хочу обратить внимание, что мы будем использовать Spring версии 3.2.5.

Вот то содержимое файла pom.xml, которое должно быть у вас:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.devcolibri.common</groupId>
	<artifactId>SpringMVC</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>

	<properties>
		<spring.version>3.2.5.RELEASE</spring.version>
        <javax.servlet>3.0.1</javax.servlet>
	</properties>

	<dependencies>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${javax.servlet}</version>
            <scope>provided</scope>
        </dependency>

	</dependencies>

	<build>
		<finalName>SpringMVC</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

 

Шаг 1. Первоначальная подготовка

Для начало я скачал проект с урок Spring 3. MVC — Hello world и открыл его в Intellij IDEA.

Структура нашего проекта:

Как вы видите у насесть mvc-dispatcher-servlet.xml именно в нем идут все настройки нашего SpringMVC проекта. Давайте от него избавимся, заменив все конфигурации на JavaConfig.

 

Шаг 2. Избавляемся от web.xml

Теперь давайте создадим пакет config и в нем создаем класс Initializer.java он будет инициализировать наш Dispatcher Servlet:

package com.devcolibri.common.config;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class Initializer implements WebApplicationInitializer {

    // Указываем имя нашему Servlet Dispatcher для мапинга
    private static final String DISPATCHER_SERVLET_NAME = "dispatcher";

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();

        // Регистрируем в контексте конфигурационный класс, который мы создадим ниже
        ctx.register(WebAppConfig.class);
        servletContext.addListener(new ContextLoaderListener(ctx));

        ctx.setServletContext(servletContext);

        ServletRegistration.Dynamic servlet = servletContext.addServlet(DISPATCHER_SERVLET_NAME, 
                                                                        new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }

}

Данный класс выполняет анналогичную функцию файла web.xml, поэтому заходим в web.xml и свободно удаляем все кроме каркаса:

<web-app id="WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

</web-app>

 

Шаг 3. Избавляемся от mvc-dispatcher-servlet.xml

JavaConfig — это представление инициализации бинов в виде Java класса.

Начнем с того, что посмотрим содержимое mvc-dispatcher-servlet.xml файла:

<context:component-scan base-package="com.devcolibri.common.controller" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix">
		<value>/WEB-INF/pages/</value>
	</property>
	<property name="suffix">
		<value>.jsp</value>
	</property>
</bean>

Теперь давайте создадим в пакете config новый класс WebAppConfig.java:

package com.devcolibri.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan("com.devcolibri.common")
public class WebAppConfig extends WebMvcConfigurerAdapter {

    // Позволяет видеть все ресурсы в папке pages, такие как картинки, стили и т.п.
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }

    // а этот бин инициализирует View нашего проекта
    // точно это же мы делали в mvc-dispatcher-servlet.xml
    @Bean
    public InternalResourceViewResolver setupViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/pages/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);

        return resolver;
    }

}

Давайте познакомимся с аннотациями:

@Configuration — (для класса) говорит Spring, что это конфигурационный класс;

@EnableWebMvc — (для класса) указывает, что конфигурация поддерживает Web MVC;

@ComponentScan(«com.devcolibri.common») — (для класса) говорим Spring-у в каком пакете будут лежать controllers и сервисы для их инициализации.

@Bean — (для метода) — указывает, что аннотируемый метод является инициализацией бина требуемого для выполнение вашей логики.

Теперь смело удалейм mvc-dispatcher-servlet.xml, он нам уже ненужен.

И еще переместим папку pages на уровень высше. Сравните структуру всех файлов:

Теперь проект можно собрать и задеплоить на сервер, результат вы получите тот же, что и в первоначальном проекте, но уже с использованием JavaConfig классов.

Урок создан: 09 декабря 2013 | Просмотров: 32711 | Автор: Александр Барчук | Правила перепечатки