Arquitetura - DAS-2017-1-Grupo1/estudo-framework GitHub Wiki

1. Contexto

Spring é um conjunto de frameworks open source de aplicação para a plataforma Java. Atualmente mantida pela Pivotal Software, Inc., empresa fundada em 2013 como ramo da Dell Technologies focada em serviços e em desenvolvimento de software, principalmente para o mercado de big data.

Para este projeto, iremos concentrar nossos esforços de análise no Spring Web MVC, framework HTTP com base em servlets que provê ganchos para extensão e customização de aplicações web e/ou RESTful web services.

2. Módulos da Arquitetura

2.1. O Ecossistema Spring

O ecossistema Spring possui uma arquitetura em camadas na qual consiste em diversos módulos de frameworks. Todos estes módulos são desenvolvidos em cima de um container núcleo (core) IoC (inversion of control). A Figura 1 descreve os módulos e seus principais frameworks.

Módulos do framework Spring

Figura 1 - Módulos do framework Spring.

2.1.1. O Módulo Core

Provê as funções de injeção de dependência (dependency injection - DI) na qual é o principal mecanismo do Spring. Tal módulo possui o BeanFactory, uma implementação do Factory Pattern na qual cria beans de acordo com configurações providas pelo desenvolvedor em um arquivo XML.

2.1.2. O Módulo AOP

O módulo de programação orientada à aspectos permite ao desenvolvedor definir métodos-interceptadores e pontos de corte para manter os contextos isolados. Tal módulo é configurado em tempo de execução. Os principais frameworks deste módulo são:

  • Spring AOP;
  • AspectJ Integration.

2.1.3. O Módulo DAO

Tal módulo provê uma camada de abstração para tarefas de baixo nível envolvendo criações e manutenções de conexões. Também mantêm uma hierarquia de exceções significativas independentes do tipo de banco de dados empregado. Utiliza o módulo de AOP para gerenciar transações. Os principais frameworks deste módulo são:

  • Spring JDBC;
  • Transaction Management.

2.1.4. O Módulo ORM

Spring não provê o seu próprio mapeamento entre objeto-relacionamento (object-relational mapping - ORM), ao invés disso, oferece integrações com os mais populares ORMs como Hibernate, JPA (Java Persistance API), Oracle TopLink, entre outros.

2.1.5. O Módulo JEE

O módulo JEE (Java platform Enterprise Edition) extende as principais funcionalidades nativas da plataforma Java para abstrações mais simples, facilmente acopladas à um projeto Spring. Alguns exemplos de funcionalidades que o módulo oferece são:

  • JMX (Java Management Extensions);
  • JCA (Java EE Connector Architecture);
  • EJB (Enterprise Java Bean);
  • JMS (Java Message Service);
  • LDAP (Lightweight Directory Access Protocol).

2.1.6. O Módulo Web

Spring oferece um framework MVC (model-view-controller) que simplifica a tarefa de desenvolvimento de aplicações web. Além disso, permite a integração com os mais populares frameworks MVC do mercado, tais como:

2.2. O Spring Web MVC Framework

Projetado ao redor da DispatcherServlet que despacha requisições para entidades responsáveis pela sua manipulação, chamadas de handlers. O principal handler é configurado através das anotações @Controller e @RequestMapping, onde ambas oferecem um vasto alcance de métodos flexíveis de manipulações. A partir da versão do Spring 3.0, a @Controller também permite a criação de RESTful web sites através da anotação @PathVariable e de outras funcionalidades. O fluxo de processamento de requisição entre esses módulos podem ser vistos na Figura 2.

Fluxo de processamento de requisição no Spring Web MVC Framework

Figura 2 - Fluxo de processamento de requisição no Spring Web MVC Framework.

A arquitetura MVC do framework fornece:

  • Uma camada modelo (model) que encapsula os dados da aplicação;
  • Uma camada visão (view) responsável por renderizar dados da modelo e gerar uma saída HTML de modo que o navegador do cliente possa interpretar, e;
  • Uma camada controle (controller) responsável por processar requisições do usuário e construir um modelo apropriado para passar para a visão renderizar.

A sequência de eventos correspondente à uma requisição de origem HTTP para o DispatcherServlet é:

  1. Após receber a requisição HTTP, DispatcherServlet consulta o HandlerMapping para chamar a Controller apropriada;
  2. A Controller pega a requisição e chama o método de serviço apropriado baseado em um uso de um método GET ou POST. O método de serviço irá configurar os dados advindos da modelo, de acordo com as regras de negócio e retornará o nome da View para a DispatcherServlet;
  3. A DispatcherServlet, através do auxílio da ViewResolver, irá pegar a View definida para a requisição;
  4. Uma vez que a View é finalizada, a DispatcherServlet transmite os dados da modelo para a View na qual é finalmente renderizada no navegador.

Todos os módulos descritos anteriormente são definidos pela WebApplicationContext, esta que é uma instância da ApplicationContext mantida no núcleo do ecossistema Spring. Tal WebApplicationContext deve conter todas as beans de infraestrutura que deverão ser compartilhada entre outros contextos e instâncias de servlets. Essas beans herdadas podem ser sobrescritas em um escopo específico de uma servlet, e é possível definir uma nova bean, específica de um escopo, para uma dada instância de servlet. A Figura 3 apresenta a hierarquia descrita anteriormente. A Figura 4 apresenta uma hierarquia com apenas um contexto raíz para cenários de DispatcherServlet única.

Típica hierarquia de contexto no Spring Web MVC Framework

Figura 3 - Típica hierarquia de contexto no Spring Web MVC Framework.

Contexto raíz único no Spring Web MVC Framework

Figura 4 - Contexto raíz único no Spring Web MVC Framework.

2.2.1. Frozen-Spots e Hot-Spots

Segundo Buschmann et al. (1996), Pree (1995) e Pinto (2000) um framework é definido como um software parcialmente completo projetado para ser instanciado. Tendo em vista o conceito apresentado todo framework é composto por uma série de abstrações que visam estabelecer de forma bem definida uma espécie de configuração padrão para atender de forma genérica um problema específico.

Tais configurações padrões podem ser chamadas de Frozen-Spots, pois são módulos de código já implementados pelo framework que garantem a arquitetura e que não podem ser alterados pelo desenvolvedor.

Por outro lado, como um framework é um software genérico, mesmo que para um problema específico, este deve possuir uma forma de extensão para atender as necessidades do desenvolvedor, estes pontos de extensão são chamados Hot-Spots e permitem que o desenvolvedor implemente um comportamente específico em determinadas parte do framework.

A imagem abaixo apresenta os Hot-Spots e Frozen-Spots do Spring Web MVC Framework:

Frozen-Spots e Hot-Spots do Spring Web MVC Framework

Figura 5 - Frozen-Spots e Hot-Spots do Spring Web MVC Framework

2.2.1.1 Frozen-Spots

  • Dispatcher Servlet
  • Handler Mapping
  • Handler Adapter
  • View Resolver
  • Model
  • Database

2.2.1.2 Hot-Spots

  • Controller
  • view name
  • Service
  • Repository