Extensão do Framework - DAS-2017-1-Grupo1/estudo-framework GitHub Wiki

Como extender as funcionalidades do Spring MVC

Basicamente o Spring conta com anotações para gerir o mecanismo controlador de um projeto Spring. A anotação @Controller indica que uma classe é um controlador, combinado a anotações @RequestMapping é possível mapear métodos para responderem requisições HTTP, ou mesmo a classe para que seus métodos iniciem o caminho a partir do valor passado na anotação.

As views são automaticamente redirecionadas depois de uma configuração XML feita para dizer onde devem ficar. Quando os métodos dos controladores são requisitados, será retornado a view que o Spring deve usar como resposta, assim ele busca dentro da pasta configurada pela string passada como resposta.

Portanto vamos supor que você queira implementar um TodoController, para um objeto de negócio Todo, no Spring MVC, ficaria assim:

@Controller
public class TodoController {

	@RequestMapping(value = "/add")
	public String adiciona(Todo todo){
	  //... logic

	  // jsp dispatched
	  return "todo_added";
	}

	// .. Another methods
}

Na API de servlets do Java tudo isso seria feito manualmente, o que exige muito retrabalho para lidar com o tratamento das requisições.

Bibliotecas e componentes no Spring

O Spring Web MVC conta com algumas dependências como o spring IoC(Um container de injeção de dependências) e spring beans(para gerenciamento dos beans da aplicação).

Com essas dependências é possível criar componentes na aplicação de acordo com vários escopos. Por exemplo, os controladores anotados com @Controller, tal como foi explicado acima, são gerados através do container IoC para gerar um novo objeto Controller por requisição.

Portanto, se quisessemos por exemplo criar um Singleton em uma aplicação spring, bastaria utilizar:

@Scope(value = "singleton")
@Component
public class MySingleton {
    //...
}

Dessa forma o IoC saberia que deve existir uma única instancia desse objeto para um IoC ativo. Para usar esse componente na nossa aplicação bastaria usar a anotação @Autowired, tal que o seria injetado via construtor ou método setter:

public class TodoController {
    private MySingleton singleton;

    @Autowired
    public TodoController(MySingleton singleton) {
        this.singleton = singleton;
    }

    // Ou dessa forma
    @Autowired
    public void setMySingleton(MySingleton singleton) {
        this.singleton = singleton;
    }

}

Existem algumas configurações intermediárias que precisam ser feitas mas não contemplam esse tutorial. Em suma o funcionamento do Spring se dá dessa forma.

Referências