Hoje vamos aprender a configurar um projeto Spring MVC utilizando apenas anotações e classes Java, nesse projeto vamos utilizar a versão 4.X.X do Spring, utilizaremos o Maven para resolução de dependências,Tomcat como container para rodar nosso projeto e o Eclipse( estou utilizando a versão Luna ) como IDE.

Vamo começar criando o projeto Maven, utilize o atalho "Alt + Shift + N" e selecione Maven Project, ou selecione no menu File > New > Maven Project. Agora na janela de criação do projeto selecione a opção "Create a simple project ( skip archetype selection ) e clique em "Next". Para o Group Id teremos o valor "me.efraimgentil", para Artifact Id o valor "spring-annotation-example", no Packaging vamos selecionar "War" e clicar em "Finish"

Com o projeto criado, vamos colocar as dependências necessárias para configurar e rodar o projeto com Spring MVC, veja as dependências necessárias a seguir:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>4.3.4.RELEASE</version>
</dependency>

Com essas dependências já podemos iniciar nossa configuração do Spring MVC, para iniciar vamos criar a classe SpringCofing no pacote "me.efraimgentil.springannotationexample.config", como a seguir:

package me.efraimgentil.springannotationexample.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = {"me.efraimgentil.springannotationexample"  })
public class SpringConfig {
  
}

A classe vai ficar vazia, estamos apenas sinalizando para o Spring que pacotes queremos que ele escaneie para identificar seus componentes

A próxima classe que vamos criar é a SpringMvcConfig, selecione o mesmo pacote da classe anterior, como a seguir:

package me.efraimgentil.springannotationexample.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.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"me.efraimgentil.springannotationexample.controller"  })
public class SpringMvcConfig extends WebMvcConfigurerAdapter {
  
  @Bean
  public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver
                         = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
  }
  
}

A anotação @EnableWebMvc habilita as configurações padrão do Spring MVC, e registra os componentes básicos necessários. Note o @Bean que estamos registrando InternalResourceViewResolver, precisamos dele para que o Spring MVC encontre nossas páginas JSP no caminho que especificamos, no caso "/WEB-INF/views/", então não se esqueça de criar a pasta "views" dentro do seus diretório "WEB-INF", para esse objeto também especificamos o sufixo dos arquivos que serão considerados como views

Agora precisamos criar o nosso inicializador, basicamente ele funciona como nosso arquivo web.xml, veja a seguir como fica a classe WebInitializer

package me.efraimgentil.springannotationexample.config;

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

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class[]{ SpringConfig.class };
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class[]{  SpringMvcConfig.class };
  }

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

}

Nossa classe WebInitializer extende a classe AbstractAnnotationConfigDispatcherServletInitializer do Spring, e me obriga a implementar 3 metodos, o primeiro "getRootConfigClasses" estou retornando as classes que possuem minha configuração do Spring por anotação, no segundo metodo especifico as classes de configuração que fazem alterações no ServletContext, no caso a classe SpringMvcConfig faz alterações e cofigurações do dispatcher padrão do Spring. E o último método "getServletMappings" especifica o caminho do meu Servlet padrão, no caso vamos usar o raiz "/", para que toda requisição passe pelo meu Dispatcher do Spring MVC

Note que vocẽ pode ver configurações que retorna null no método "getServletConfigClasses", e todas as classes de configuração no método "getRootConfigClasses", essa forma também funciona sem problema ( faça o teste =D )

Com isso temos nossa configuração do Spring MVC somente com anotações pronta, para testarmos vamos criar um Controller simples no pacote "me.efraimgentil.springannotationexample.controller" como a seguir:

package me.efraimgentil.springannotationexample.controller;

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

@Controller
public class HelloController {
  
  @RequestMapping(value= {"/"} , method = RequestMethod.GET )
  public String hello(){
    return "hello";
  }
  
}

Esse controller cria uma rota na raiz da aplicação, então esse método será chamado quando fizermos um request para o endereço "http://localhost:8080/spring-annotation-example/", esse endereço pode variar dependendo da configuração do seu Tomcat. O método "hello" retorna a String "hello", como fizemos a configuração do InternalResourceViewResolver, o Spring vai buscar uma arquivo de nome "hello.jsp" na pasta que configuramos para o resolver, então dentro da pasta "WEB-INF/views/" crie o arquivo "hello.jsp", como a seguir por exemplo:

webapp
- WEB-INF
- - views
- - - hello.jsp
<!-- Arquivo hello.jsp -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello</title>
</head>
<body>
Hello
</body>
</html>

Agora basta rodar seu projeto no Tomcat e acessar o endereço para ver o resultado

Essa é apenas uma configuração basica do Spring com Anotações, vocẽ pode acessar os fontes do projeto no endereço: https://github.com/efraimgentil/spring-annotation-example