Pull to refresh

Spring MVC — JavaConfig либо конфигурация проекта без XML файлов

Reading time 6 min
Views 98K
Доброго времени суток уважаемые хабравчане. Как-то мне пришлось писать небольшой проект, так как у меня была возможность свободного выбора технологий я решил использовать Spring Framework. Сразу же хочу сказать я не являюсь гуру в данном фреймворке, и буду благодарен правкам.

Немного поискав на хабре, я не смог найти именно того о чем хочу вам сейчас рассказать и продемонстрировать. Поэтому решил написать пост на данную тему. Речь пойдет о JavaConfig, а именно о том как сконфигурировать Spring MVC проект не используя *.xml конфигурации, например: (mvc-dispatcher-servlet.xml).

На тему Spring MVC есть неплохой материал тут и тут, но в этих примерах используются xml конфигурации. Я же хочу показать как создать структуру проекта Spring MVC используя JavaConfig.

Что же такое JavaConfig?


JavaConfig — это альтернатива привычной нам XML конфигурации, но используя не xml разметку, а синтаксис Java.
Мне нравится использовать JavaConfig, в первую очередь потому что это Java, мы видим java код, что есть удобно, во-вторых большинство ошибок в конфигурации можно отловить на момент написания конфигурации в этом вам поможет любимая IDE в моем случае это Intellij IDEA, но даже если IDE говорит что все круто, то у вас есть шанс отловить ошибку в конфигурировании на момент компиляции.

Преимущества:

1. Главное преимущество, на мой взгляд, это Java синтаксис;
2. Вы получаете все возможности IDE по отношению работы с кодом, автоматическая генирация кода, авто-подставка значений, подсказки и т.п.;
3. Больше гибкости за счет использования объектов и их методов;
4. Нет необходимости в полной сборке и деплоя проекта для того чтобы отловить неисправность в xml конфигурации. (но бывают исключения, например: NullPointerException).

JavaConfig существовала раньше как отдельный проект, но начиная со Spring Core 3.0 данный проект стал часть core проекта. Теперь для того чтобы иметь возможность писать конфигурацию используя JavaConfig достаточно использовать Spring Core 3+

Стандартная конфигурация с использованием XML


Для начало рассмотрим структуру и конфигурацию проекта Spring MVC с использованием XML конфигураций, а после уже переведем на JavaConfig.
Вот так выглядит структура проекта:


Начнем с добавления зависимостей в pom.xml:
<properties>
    <spring.version>3.2.9.RELEASE</spring.version>
</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>

</dependencies>


Теперь создадим простую jsp страницу index.jsp:
<html>
<body>
	<h1>Message : ${message}</h1>	
</body>
</html>


И последнее, что не касается конфигурации это контроллер HelloController.java:
package com.devcolibri.common.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/welcome")
public class HelloController {

	@RequestMapping(method = RequestMethod.GET)
	public String printWelcome(ModelMap model) {

		model.addAttribute("message", "Spring 3 MVC - Hello World");
		return "hello";

	}
	
}


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

Теперь рассмотрим как сконфигурировать проект используя XML файл. Начнем с mvc-dispatcher-servlet.xml именно этот файл будет конфигурировать наш проект, в основном тут мы описываем все наши beans.

Содержимое файла mvc-dispatcher-servlet.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<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>

</beans>

В данной конфигурации мы указываем, где искать все наши контроллеры, сервисы и другие компоненты с помощью тега: context:component-scan, а также инициализируем InternalResourceViewResolver, который отвечайте за показ View в нашем случае это jsp страницы.

Конфигурация на основе JavaConfig


Так как JavaConfig это простые java классы, создадим для них пакет config как показанно на рис. ниже, а также вот наша новая структура проекта уже без web.xml и mvc-dispatcher-servlet.xml.



Как видно из структуры проекта у нас появилось два класса в пакете config именно они и являются заменой xml конфигурации.
Начнем с WebConfig:

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 WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/WEB-INF/pages/**").addResourceLocations("/pages/");
    }

    @Bean
    public InternalResourceViewResolver setupViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);

        return resolver;
    }

}


Аннотации:

@Configuration — собственно эта аннотация и говорит о том, что данный класс является Java Configuration;
@EnableWebMvc — эта аннотация разрешает нашему проекту использовать MVC;
@ComponentScan(«com.devcolibri.common») — аналогично тому component-scan который был в mvc-dispatcher-servlet.xml, говорит, где искать компоненты проекта.
Bean — указывает на то что это инициализация бина, и он будет создан с помощью DI.

Конфигурация

WebMvcConfigurerAdapter — унаследовавшись от этого класса мы получим возможность сконфигурировать ResourceLocations.
addResourceHandlers(ResourceHandlerRegistry registry) — переопределив данный метод мы сможем указать где будут лежать ресурсы нашего проекта, такие как css, image, js и другие.
InternalResourceViewResolver — аналогичная конфигурация с mvc-dispatcher-servlet.xml.
<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>

Теперь нужно зарегистрировать конфигурацию в Spring Context это нам позволит сделать наш класс AppInit:
package com.devcolibri.common.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    // Этот метод должен содержать конфигурации которые инициализируют Beans
    // для инициализации бинов у нас использовалась аннотация @Bean
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{
                WebConfig.class
        };
    }

    // Тут добавляем конфигурацию, в которой инициализируем ViewResolver
    @Override
    protected Class<?>[] getServletConfigClasses() {

        return new Class<?>[]{
                WebConfig.class
        };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

}


Добавим необходимые зависимости и плагины

В pom.xml нужно добавить еще две зависимости:
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
</dependency>

<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>


А теперь нужно добавить maven-war-plugin с помощтю которого мы сможем отключить необходимость web.xml файла.
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>


На этом все. Надеюсь данный материал был полезен.
p.s. Я не гуру, и буду рад правкам в коде.
Tags:
Hubs:
+6
Comments 0
Comments Leave a comment

Articles