User:Mateus Jonas/sandbox

O Spring Framework é um framework de aplicação e inversão de container de controle para a plataforma Java. Os principais recursos da estrutura podem ser usados ​​por qualquer aplicativo Java, mas há extensões para criar aplicativos da Web sobre a plataforma Java EE (Enterprise Edition). Embora a estrutura não imponha nenhum modelo de programação específico, ela se tornou popular na comunidade Java como um complemento ao modelo Enterprise JavaBeans (EJB). O Spring Framework é de código aberto.

Historico de versões
A primeira versão foi escrita por Rod Johnson, que lançou o framework com a publicação de seu livro Expert One-on-One J2EE Design and Development em outubro de 2002. O framework foi lançado pela primeira vez sob a licença Apache em junho de 2003. A primeira versão de produção, 1.0, foi lançada em março de 2004. O framework Spring 1.2.6 ganhou um Prêmio Jolt e um Prêmio de inovação JAX em 2006. Spring 2.0 foi lançado em outubro de 2006, Spring 2.5 em novembro de 2007, Spring 3.0 em dezembro de 2009, Spring 3.1 em dezembro de 2011 e Spring 3.2.5 em novembro de 2013. O Spring Framework 4.0 foi lançado em dezembro de 2013. Melhorias notáveis ​​no Spring 4.0 incluíram suporte para Java SE (Padrão Edition) 8, Groovy (linguagem de programação) 2, alguns aspectos do Java EE 7 e WebSocket.

O Spring Boot 1.0 foi lançado em abril de 2014.

O Spring Framework 4.2.0 foi lançado em 31 de julho de 2015 e foi imediatamente atualizado para a versão 4.2.1, lançada em 01 de setembro de 2015.< É "compatível com Java 6, 7 e 8, com foco nos principais refinamentos e recursos modernos da web".

O Spring Framework 4.3 foi lançado em 10 de junho de 2016 e terá suporte até 2020 Ele "será a geração final dentro dos requisitos gerais do sistema Spring 4 (Java 6+, Servlet 2.5+), [...]"

O Spring 5 foi anunciado para ser construído sobre o Reactor Core compatível com Reactive Streams.

O Spring Framework 6.0 foi lançado em 16 de novembro de 2022 e veio com uma linha de base Java 17+ e uma mudança para Jakarta EE 9+ (no namespace ), com foco no Jakarta EE 10 lançado recentemente APIs como Servlet 6.0 e JPA 3.1.

Módulos
O Spring Framework inclui vários módulos que fornecem uma gama de serviços:
 * Spring Core Container: este é o módulo base do Spring e fornece contêineres de mola (BeanFactory e ApplicationContext).
 * Programação orientada a aspectos: permite implementar preocupações transversais.
 * Autenticação]] e autorização: processos de segurança configuráveis ​​que suportam uma gama de padrões, protocolos, ferramentas e práticas através do subprojeto Spring Security (anteriormente Acegi Security System for Spring).
 * Convenção sobre configuração: uma solução de desenvolvimento rápido de aplicativos para aplicativos empresariais baseados em Spring é oferecida no módulo Spring Roo
 * Data access: trabalhando com sistemas de gerenciamento de banco de dados relacional na plataforma Java usando as ferramentas Java Database Connectivity (JDBC) e object-relational mapping e com NoSQL bancos de dados
 * Inversion of control container: configuração dos componentes da aplicação e gerenciamento do ciclo de vida dos objetos Java, feito principalmente via injeção de dependência
 * Mensagens: registro declarativo de objetos ouvintes de mensagens para consumo transparente de mensagens de fila de mensagens via Java Message Service (JMS), melhoria do envio de mensagens por meio de APIs JMS padrão
 * Model–view–controller: uma estrutura baseada em HTTP e servlet que fornece ganchos para extensão e personalização para aplicativos da Web e RESTful (estado representacional transferência) serviços da Web.
 * Estrutura de acesso remoto: declarativa chamada de procedimento remoto (RPC) estilo Marshalling de objetos Java em redes que suportam Java remote method invocation (RMI), CORBA  (Common Object Request Broker Architecture) e protocolos baseados em HTTP, incluindo Web services (SOAP (Simple Object Access Protocol))
 * Processamento de transações: unifica várias APIs de gerenciamento de transações e coordena transações para objetos Java
 * Gerenciamento remoto: exposição declarativa e gerenciamento de objetos Java para configuração local ou remota via Java Management Extensions (JMX)
 * Teste de software: classes de suporte para escrever testes de unidade e testes de integração

Inversão do container de controle (injeção de dependência)
Central para o Spring Framework é seu contêiner inversão de controle (IoC), que fornece um meio consistente de configurar e gerenciar objetos Java usando Reflexão. O contêiner é responsável por gerenciar Vida útil do objeto específicos: criar esses objetos, chamar seus métodos de inicialização e configurar esses objetos conectando-os.

Os objetos criados pelo contêiner também são chamados de objetos gerenciados ou beans. O contêiner pode ser configurado carregando arquivos XML (Extensible Markup Language) ou detectando Java annotations específicos em classes de configuração. Essas origens de dados contêm as definições de bean que fornecem as informações necessárias para criar os beans.

Os objetos podem ser obtidos por meio de pesquisa de dependência ou injeção de dependência. Pesquisa de dependência é um padrão em que um chamador solicita ao objeto container um objeto com um nome específico ou de um tipo específico. A injeção de dependência é um padrão onde o contêiner passa objetos pelo nome para outros objetos, por meio de construtor, Propriedade ou Padrão de método de fábrica.

Em muitos casos, não é necessário usar o contêiner ao usar outras partes do Spring Framework, embora usá-lo provavelmente torne um aplicativo mais fácil de configurar e personalizar. O contêiner Spring fornece um mecanismo consistente para configurar aplicativos e se integra a quase todos os ambientes Java, desde aplicativos de pequena escala até aplicativos corporativos de grande porte.

O contêiner pode ser transformado em um contêiner EJB (Enterprise JavaBeans) 3.0 parcialmente compatível por meio do projeto Pitchfork. Alguns criticam o Spring Framework por não cumprir os padrões. No entanto, a SpringSource não vê a conformidade com o EJB 3 como um objetivo principal e afirma que o Spring Framework e o contêiner permitem modelos de programação mais poderosos. O programador não cria diretamente um objeto, mas descreve como ele deve ser criado, definindo-o no arquivo de configuração do Spring. Da mesma forma, serviços e componentes não são chamados diretamente; em vez disso, um arquivo de configuração do Spring define quais serviços e componentes devem ser chamados. Este IoC destina-se a aumentar a facilidade de manutenção e teste.

Framework de programação orientada a aspectos
O Spring Framework tem seu próprio Aspect-oriented Programming (AOP) framework que modulariza preocupações transversais em Aspect. A motivação para criar uma estrutura AOP separada vem da crença de que deve ser possível fornecer recursos AOP básicos sem muita complexidade em design, implementação ou configuração. A estrutura Spring AOP também aproveita ao máximo o contêiner Spring.

A estrutura Spring AOP é Padrão de proxy e é configurado em tempo de execução (fase do ciclo de vida do programa). Isso elimina a necessidade de uma etapa de compilação ou entrelaçamento no tempo de carregamento. Por outro lado, a interceptação permite apenas a execução de métodos públicos em objetos existentes em um ponto de junção.

Comparado com a estrutura AspectJ, o Spring AOP é menos poderoso, mas também menos complicado. O Spring 1.2 inclui suporte para configurar aspectos AspectJ no contêiner. O Spring 2.0 adicionou mais integração com o AspectJ; por exemplo, a linguagem pointcut é reutilizada e pode ser misturada com aspectos baseados em Spring AOP. Além disso, o Spring 2.0 adicionou uma biblioteca Spring Aspects que usa o AspectJ para oferecer recursos comuns do Spring, como gerenciamento declarativo de transações e injeção de dependência por meio do tempo de compilação ou do tempo de carregamento do AspectJ. SpringSource também usa AspectJ AOP em outros projetos Spring, como Spring Roo e Spring Insight, com Spring Security também oferecendo uma biblioteca de aspectos baseada em AspectJ.

O Spring AOP foi projetado para torná-lo capaz de trabalhar com preocupações transversais dentro do Spring Framework. Qualquer objeto criado e configurado pelo contêiner pode ser enriquecido usando o Spring AOP.

O Spring Framework usa Spring AOP internamente para gerenciamento de transações, segurança, acesso remoto e JMX.

Desde a versão 2.0 do framework, o Spring fornece duas abordagens para a configuração do AOP:


 * abordagem baseada em esquema e
 * Estilo de anotação baseado em @AspectJ.

A equipe do Spring decidiu não introduzir uma nova terminologia relacionada ao AOP; portanto, na documentação de referência do Spring e na API, termos como aspecto, ponto de junção, conselho , corte de ponto, introdução, objeto de destino ( advised object), AOP proxy e weaving têm todos os mesmos significados que na maioria das outras estruturas AOP (particularmente AspectJ).

Estrutura de acesso a dados
A estrutura de acesso a dados do Spring aborda as dificuldades comuns que os desenvolvedores enfrentam ao trabalhar com bancos de dados em aplicativos. O suporte é fornecido para todas as estruturas populares de acesso a dados em Java: JDBC, iBatis/MyBatis, Hibernate, Java Data Objects (JDO, descontinuado desde 5.x), Jakarta Persistence API (JPA), Oracle TopLink, Apache OJB e Apache Cayenne, entre outros.

Para todas essas estruturas suportadas, o Spring fornece esses recursos


 * Gerenciamento de recursos - adquirindo e liberando recursos de banco de dados automaticamente
 * Tratamento de exceções - traduzindo exceção relacionada ao acesso a dados para uma hierarquia de acesso a dados Spring
 * Participação na transação – participação transparente nas transações em andamento
 * Desempacotamento de recursos - recuperando objetos de banco de dados de wrappers de pool de conexão
 * Abstração para manipulação de binary large object (BLOB) e character large object (CLOB)

Todos esses recursos ficam disponíveis ao usar Padrão de método de modelo fornecidas pelo Spring para cada estrutura suportada. Os críticos disseram que essas classes de modelo são intrusivas e não oferecem nenhuma vantagem sobre o uso (por exemplo) da API do Hibernate diretamente. Em resposta, os desenvolvedores do Spring possibilitaram o uso direto das APIs Hibernate e JPA. No entanto, isso requer gerenciamento de transação transparente, pois o código do aplicativo não assume mais a responsabilidade de obter e fechar recursos do banco de dados e não oferece suporte à conversão de exceção.

Juntamente com o gerenciamento de transações do Spring, sua estrutura de acesso a dados oferece uma abstração flexível para trabalhar com estruturas de acesso a dados. O Spring Framework não oferece uma API comum de acesso a dados; em vez disso, todo o poder das APIs suportadas é mantido intacto. O Spring Framework é o único framework disponível em Java que oferece ambientes gerenciados de acesso a dados fora de um servidor de aplicativos ou contêiner. Ao usar o Spring para gerenciamento de transações com o Hibernate, os seguintes beans podem ter que ser configurados: Outros pontos de configuração incluem:
 * Uma Data Source como  ou
 * Uma SessionFactory como  com um atributo DataSource
 * Um HibernateProperties como
 * Um TransactionManager como  com um atributo SessionFactory
 * Uma configuração AOP de pontos de corte.

Gerenciamento de transações
A estrutura de gerenciamento de transações do Spring traz um mecanismo de abstração para a plataforma Java. Sua abstração é capaz de:
 * trabalhando com local e transação distribuída (a transação local não requer um servidor de aplicativos)
 * trabalhando com transação aninhadas
 * trabalhando com savepoints
 * trabalhando em quase todos os ambientes da plataforma Java

Em comparação, Java Transaction API (JTA) suporta apenas transações aninhadas e transações globais e requer um servidor de aplicativos (e, em alguns casos, também a implantação de aplicativos em um servidor de aplicativos).

O Spring Framework envia um PlatformTransactionManager para várias estratégias de gerenciamento de transações:
 * Transações gerenciadas em uma conexão JDBC
 * Transações gerenciadas em unidades de trabalho de mapeamento objeto-relacional
 * Transações gerenciadas via JTA TransactionManager e UserTransaction
 * Transações gerenciadas em outros recursos, como object databases

Além desse mecanismo de abstração, a estrutura também fornece duas maneiras de adicionar gerenciamento de transações aos aplicativos:
 * Processualmente, usando o TransactionTemplate do Spring
 * Declarativamente, usando metadados como anotações XML ou Java (@Transactional, etc.)

Juntamente com a estrutura de acesso a dados do Spring – que integra a estrutura de gerenciamento de transações – é possível configurar um sistema transacional por meio de configuração sem depender de JTA ou EJB. A estrutura transacional também se integra com mecanismos de mensagens e cache.

Estrutura de controlador de visualização de modelo
O Spring Framework possui seu próprio model–view–controller (MVC) web application framework, que não foi originalmente planejado. Os desenvolvedores do Spring decidiram escrever sua própria estrutura da Web como uma reação ao que eles perceberam como o design pobre da (então) popular estrutura da Web Jakarta Struts, bem como deficiências em outros frameworks disponíveis. Em particular, eles sentiram que não havia separação suficiente entre as camadas de apresentação e manipulação de solicitação, e entre a camada de manipulação de solicitação e o modelo.

Assim como o Struts, o Spring MVC é um framework baseado em requisições. A estrutura define strategy interfaces para todas as responsabilidades que devem ser tratadas por uma estrutura moderna baseada em solicitações. O objetivo de cada interface é ser simples e claro para que seja fácil para os usuários do Spring MVC escrever suas próprias implementações, se assim o desejarem. O MVC abre caminho para um código front-end mais limpo. Todas as interfaces são fortemente acopladas ao Servlet API. Este acoplamento estreito com a API do Servlet é visto por alguns como uma falha por parte dos desenvolvedores do Spring em oferecer uma abstração de alto nível para aplicativos baseados na Web. No entanto, esse acoplamento garante que os recursos da API do Servlet permaneçam disponíveis para os desenvolvedores, além de oferecer uma estrutura de alta abstração para facilitar o trabalho com ela.

A classe DispatcherServlet é o front controller da estrutura e é responsável por delegar o controle para as várias interfaces durante as fases de execução de um requisição HTTP.

As interfaces mais importantes definidas pelo Spring MVC, e suas responsabilidades, estão listadas abaixo:
 * Controlador: fica entre o Modelo e a Visualização para gerenciar as solicitações recebidas e redirecionar para a resposta adequada. O controlador mapeará a solicitação http para os métodos correspondentes. Ele atua como um portão que direciona as informações recebidas. Ele alterna entre entrar no modelo ou na exibição.
 * HandlerAdapter: execução de objetos que tratam das requisições recebidas
 * HandlerInterceptor: interceptação de solicitações de entrada comparáveis, mas não iguais aos filtros Servlet (o uso é opcional e não controlado pelo DispatcherServlet).
 * HandlerMapping: selecionar objetos que lidam com solicitações recebidas (manipuladores) com base em qualquer atributo ou condição interna ou externa a essas solicitações
 * LocaleResolver: resolvendo e opcionalmente salvando o locale de um usuário individual
 * MultipartResolver: facilite o trabalho com uploads de arquivos envolvendo as solicitações recebidas
 * View: responsável por retornar uma resposta ao cliente. Algumas requisições podem ir direto para a visualização sem ir para a parte do modelo; outros podem passar por todos os três.
 * ViewResolver: selecionando uma View com base em um nome lógico para a view (o uso não é estritamente necessário)

Cada interface de estratégia acima tem uma responsabilidade importante na estrutura geral. As abstrações oferecidas por essas interfaces são poderosas, portanto, para permitir um conjunto de variações em suas implementações, o Spring MVC vem com implementações de todas essas interfaces e juntas oferecem um conjunto de recursos sobre a API do Servlet. No entanto, desenvolvedores e fornecedores são livres para escrever outras implementações. O Spring MVC usa a interface Java  como uma abstração orientada a dados para o modelo em que as chaves devem ser valores de string.

A facilidade de testar as implementações dessas interfaces parece ser uma importante vantagem do alto nível de abstração oferecido pelo Spring MVC. O DispatcherServlet é fortemente acoplado à inversão Spring do contêiner de controle para configurar as camadas da web dos aplicativos. No entanto, os aplicativos da web podem usar outras partes do Spring Framework, incluindo o contêiner, e optar por não usar o Spring MVC.

Um fluxo de trabalho do Spring MVC
Quando um usuário clica em um link ou envia um formulário em seu navegador da Web, a solicitação vai para o Spring DispatcherServlet. DispatcherServlet é um controlador frontal no Spring MVC. Ele consulta um ou mais mapeamentos de manipulador. O DispatcherServlet escolhe um controlador apropriado e encaminha a solicitação para ele. O Controlador processa a solicitação específica e gera um resultado. É conhecido como Modelo. Essas informações precisam ser formatadas em html ou qualquer tecnologia de front-end como JSP. Esta é a Visualização de um aplicativo. Todas as informações estão no objeto MODEL And VIEW. Quando o controlador não está acoplado a uma exibição específica, o DispatcherServlet localiza o JSP real com a ajuda do ViewResolver.

Configuração do DispatcherServlet
DispatcherServlet deve ser configurado em web.xml

Estrutura de acesso remoto
A estrutura de acesso remoto do Spring é uma abstração para trabalhar com várias tecnologias baseadas em RPC (chamada de procedimento remoto) disponíveis na plataforma Java, tanto para conectividade de cliente quanto para organização de objetos em servidores. O recurso mais importante oferecido por essa estrutura é facilitar ao máximo a configuração e o uso dessas tecnologias, combinando inversão de controle e AOP.

A estrutura também fornece recuperação de falhas (reconexão automática após falha de conexão) e algumas otimizações para uso do lado do cliente de EJB remoto stateless session beans.

O Spring fornece suporte para esses protocolos e produtos prontos para uso


 * Protocolos baseados em HTTP
 * Hessian (protocolo de serviço Web): protocolo de serialização binária, de código aberto e mantido por protocolos baseados em CORBA
 * RMI (1): invocações de métodos usando a infraestrutura RMI ainda específica para Spring
 * RMI (2): invocações de método usando interfaces RMI em conformidade com o uso regular de RMI
 * RMI-IIOP (CORBA): invocações de método usando RMI-IIOP/CORBA
 * Enterprise JavaBean integração do cliente
 * Conectividade de bean de sessão sem estado EJB local: conectando-se a beans de sessão sem estado locais
 * Conectividade de bean de sessão sem estado EJB remoto: conectando-se a beans de sessão sem estado remotos
 * SABÃO
 * Integração com o framework de serviços Web Apache Axis

Apache CXF fornece integração com o Spring Framework para exportação de objetos no estilo RPC no lado do servidor.

A configuração do cliente e do servidor para todos os protocolos e produtos de estilo RPC suportados pela estrutura de acesso remoto Spring (exceto para o suporte do Apache Axis) é configurada no contêiner Spring Core.

Existe uma implementação alternativa de código aberto (Cluster4Spring) de um subsistema de comunicação remota incluído no Spring Framework que se destina a suportar vários esquemas de comunicação remota (1-1, 1-muitos, descoberta de serviços dinâmicos)...

Spring Boot
O Spring Boot Extension é a solução Convenção sobre configuração do Spring para criar aplicativos autônomos baseados em Spring de nível de produção que você pode "simplesmente executar". Ele é pré-configurado com a "visão opinativa" da equipe Spring sobre a melhor configuração e uso do Plataforma Spring e bibliotecas de terceiros para que você possa começar com o mínimo de confusão. A maioria dos aplicativos Spring Boot precisa de muito pouca configuração do Spring.

Características principais:


 * Crie aplicativos Spring independentes
 * Incorpore Tomcat ou Jetty (servidor da web) diretamente (não é necessário implantar arquivos WAR (formato de arquivo)])
 * Forneça Project Object Models (POMs) 'iniciais' opinativos para simplificar sua configuração Maven/Gradle
 * Configure automaticamente o Spring sempre que possível
 * Forneça recursos prontos para produção, como métricas de software, verificações de integridade e configuração externa
 * Absolutamente nenhuma geração de código e nenhum requisito para configuração XML.
 * Integração suave e suporta todos os padrões de integração empresarial.

Spring Roo
Spring Roo é um projeto comunitário que fornece uma abordagem alternativa, baseada em geração de código, usando convenção sobre configuração para criar rapidamente aplicativos em Java. Atualmente suporta Spring Framework, Spring Security e Spring Web Flow. O Roo difere de outros desenvolvimento rápido de aplicativos com foco em:


 * Extensibilidade (via complementos)
 * Produtividade da plataforma Java (ao contrário de outras linguagens)
 * Prevenção de bloqueio (Roo pode ser removido em poucos minutos de qualquer aplicativo)
 * Prevenção de tempo de execução (com vantagens de implantação associadas)
 * Usabilidade (particularmente por meio dos recursos do shell e padrões de uso)

Estrutura em lote
Spring Batch é uma estrutura para processamento em lote que fornece funções reutilizáveis ​​que são essenciais no processamento de grandes volumes de registros, incluindo:
 * registro/rastreamento
 * gerenciamento de transações
 * estatísticas de processamento de trabalho
 * reinício do trabalho

Ele também fornece serviços e recursos técnicos mais avançados que permitirão trabalhos em lote extremamente altos e de alto desempenho por meio de otimizações e técnicas de particionamento. O Spring Batch executa uma série de tarefas; um trabalho consiste em várias etapas e cada etapa consiste em uma tarefa READ-PROCESS-WRITE ou tarefa de operação única (tasklet).

O processo "READ-PROCESS-WRITE" consiste nas seguintes etapas: "ler" os dados de um recurso (valores separados por vírgula (CSV), XML ou banco de dados), "processá-los" e depois "escrevê-los" para outros recursos (CSV, XML ou banco de dados). Por exemplo, uma etapa pode ler dados de um arquivo CSV, processá-los e gravá-los no banco de dados. O Spring Batch fornece muitas classes para ler/gravar CSV, XML e banco de dados.

Para uma tarefa de operação "única" (tasklet), significa fazer apenas uma única tarefa, como limpar os recursos antes ou depois de uma etapa ser iniciada ou concluída.

As etapas podem ser encadeadas para serem executadas como um trabalho.

Framework de integração
Spring Integration é uma estrutura para Enterprise application integration que fornece funções reutilizáveis ​​essenciais para mensagens ou arquiteturas orientadas a eventos.
 * roteadores – roteia uma mensagem para um canal de mensagem com base nas condições
 * transformadores – converte/transforma/altera o payload da mensagem e cria uma nova mensagem com o payload transformado
 * adaptadores – para integração com outras tecnologias e sistemas (HTTP, AMQP (Advanced Message Queuing Protocol), JMS (Java Message Service), XMPP (Extensible Messaging and Presence Protocol), SMTP (Simple Mail Transfer Protocol), IMAP (Internet Message Access Protocol), FTP (File Transfer Protocol), bem como FTPS/SFTP, sistemas de arquivos, etc.)
 * filtros – filtra uma mensagem com base em critérios. Se os critérios não forem atendidos, a mensagem será descartada.
 * ativadores de serviço – invocam uma operação em um objeto de serviço
 * gestão e auditoria

O Spring Integration suporta arquiteturas baseadas em pipe e filtro.

Vulnerabilidade Spring4Shell
Como qualquer outro software, o Spring pode ter algumas vulnerabilidades. Um deles (CVE-2022-22965) foi nomeado "Spring4Shell", semelhante a Log4Shell.