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.
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.
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
é:
- Após receber a requisição HTTP,
DispatcherServlet
consulta oHandlerMapping
para chamar aController
apropriada; - 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 daView
para aDispatcherServlet
; - A
DispatcherServlet
, através do auxílio daViewResolver
, irá pegar aView
definida para a requisição; - Uma vez que a
View
é finalizada, aDispatcherServlet
transmite os dados da modelo para aView
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.
Figura 3 - Típica hierarquia de contexto 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:
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