O Spring Framework é um framework de aplicação e um contêiner de inversão de controle para a plataforma Java. Os recursos principais do framework podem ser usados por qualquer aplicação Java, mas existem extensões para a criação de aplicações web sobre a plataforma Jakarta EE. O framework não impõe nenhum modelo de programação específico. O framework tornou-se popular na comunidade Java como um complemento ao modelo Enterprise JavaBeans (EJB). O Spring Framework é um software livre e de código aberto.
Histórico de versões Versão Data 0.9 2003 1.0 24 de março de 2004 2.0 2006 3.0 2009 4.0 2013 5.0 2017 6.0 22 de novembro de 2022 6.1 16 de novembro de 2023 6.2 14 de novembro de 2024 7.0 13 de novembro de 2025
A primeira versão foi escrita por Rod Johnson, que lançou o framework juntamente 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 2.0 em junho de 2003. O primeiro lançamento de produção, a versão 1.0, foi lançado em março de 2004. O Spring 1.2.6 ganhou um prêmio Jolt de produtividade e um JAX Innovation Award em 2006.Jolt winners 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 8, Groovy 2, alguns aspectos do Java EE 7 e WebSocket.
Spring Framework 4.2.0 foi lançado em 31 de julho de 2015 e imediatamente atualizado para a versão 4.2.1, lançada em 1º de setembro de 2015. Ele é "compatível com Java 6, 7 e 8, com foco em refinamentos principais e recursos modernos da web".
Spring Framework 4.3 foi lançado em 10 de junho de 2016 e foi suportado até 2020. Foi anunciado que seria "a última geração dentro dos requisitos gerais do sistema Spring 4 (Java 6+, Servlet 2.5+), [...]".
Spring 5 foi construído sobre o Reactor Core compatível com Reactive Streams.
Spring Framework 6.0 foi lançado em 16 de novembro de 2022 e veio com uma base Java 17+ e uma mudança para Jakarta EE 9+ (no espaço de nomes jakarta), com foco nas APIs Jakarta EE 10 recentemente lançadas, como Servlet 6.0 e JPA 3.1.
Módulos O Spring Framework inclui vários módulos que fornecem uma variedade de serviços: Contêiner principal do Spring: este é o módulo base do Spring e fornece os contêineres Spring (BeanFactory e ApplicationContext).Documentação do Spring Framework para o Contêiner Principal Neste contexto, spring-core é o artefato encontrado no módulo core pertencente ao grupo org.springframework. O artefato spring-core consiste no contêiner IoC, bem como nas classes utilitárias usadas em toda a aplicação. Programação orientada a aspectos: permite implementar preocupações transversais. O spring-aop é um artefato para o framework AOP. Autenticação e autorização: processos de segurança configuráveis que suportam uma variedade 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 aplicações para aplicações empresariais baseadas em Spring é oferecida no módulo Spring Roo. Acesso a dados: trabalho com sistemas de gerenciamento de banco de dados relacionais na plataforma Java usando Java Database Connectivity (JDBC) e ferramentas de mapeamento objeto-relacional e com bancos de dados NoSQL. O spring-jdbc é um artefato encontrado no módulo JDBC que suporta acesso JDBC incluindo classes de configuração de fonte de dados. Contêiner de inversão de controle: configuração de componentes da aplicação e gerenciamento do ciclo de vida de objetos Java, feito principalmente via injeção de dependência. Mensageria: registro declarativo de objetos ouvintes de mensagens para consumo transparente de mensagens de filas de mensagens via Java Message Service (JMS), melhoria do envio de mensagens sobre as APIs JMS padrão. Modelo–visão–controlador: um framework baseado em HTTP e servlet que fornece ganchos para extensão e personalização para aplicações web e serviços web REST (transferência de estado representacional). Framework de acesso remoto: marshalling declarativo no estilo chamada de procedimento remoto (RPC) de objetos Java através de redes suportando invocação de método remoto Java (RMI), CORBA e protocolos baseados em HTTP, incluindo serviços web como SOAP. Gerenciamento de transações: unifica várias APIs de gerenciamento de transações e coordena transações para objetos Java. Gerenciamento remoto: exposição e gerenciamento declarativos de objetos Java para configuração local ou remota via Java Management Extensions (JMX). Testes: classes de suporte para escrever testes de unidade e testes de integração. Suporte WebFlux: suporte para usar runtimes reativos ou servidores web como UnderTow e Netty. Suporte Web Socket: suporte para comunicação usando o protocolo WebSocket. O artefato para este módulo é spring-websocket. Suporte XML: suporte para mapeamento objeto-XML. Bibliotecas como Jakarta XML Binding (JAXB) e XStream são suportadas. O artefato para este módulo é spring-oxm.
Os módulos Spring são empacotados como arquivos JAR. Esses artefatos podem ser acessados via Maven Central Repository usando Maven ou Gradle.
Contêiner de inversão de controle O contêiner de inversão de controle (IoC) é o contêiner central do Spring Framework. Ele fornece um meio consistente de configurar e gerenciar objetos Java usando reflexão. O contêiner é responsável por gerenciar os ciclos de vida dos objetos de objetos específicos: criar esses objetos, chamar seus métodos de inicialização e configurar esses objetos conectando-os entre si.
Em muitos casos, não é necessário usar o contêiner ao usar outras partes do Spring Framework, embora seu uso torne a aplicação mais fácil de configurar e personalizar. O contêiner Spring fornece um mecanismo consistente para configurar aplicações e se integra com quase todos os ambientes Java, desde aplicações de pequena escala até grandes aplicações empresariais.
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 Spring define quais serviços e componentes devem ser chamados. Essa IoC visa aumentar a facilidade de manutenção e teste.
Criando e gerenciando beans Objetos criados pelo contêiner são chamados de objetos gerenciados ou beans. O contêiner pode ser configurado carregando arquivos XML ou detectando anotações Java específicas em classes de configuração. Essas fontes de dados contêm as definições de bean que fornecem as informações necessárias para criar os beans.
A anotação @Configuration é uma anotação específica do Spring que marca uma classe como a classe de configuração. A classe de configuração fornece os beans para o ApplicationContext do Spring. Cada um dos métodos na classe de configuração Spring é configurado com a anotação @Bean. A interface ApplicationContext então retornará os objetos configurados com a anotação @Bean como beans. A vantagem da configuração baseada em Java sobre a configuração baseada em XML é melhor segurança de tipo e refatorabilidade.
Tipos de inversão de controle Existem vários tipos de inversão de controle. Injeção de dependência e busca de dependência são exemplos de inversão de controle. Objetos podem ser obtidos por meio de busca de dependência ou injeção de dependência.What is the difference between the depencylookup and dependency injection - Spring Forum. Forum.springsource.org (2009-10-28). Recuperado em 2013-11-24.
Injeção de dependência
Injeção de dependência é um padrão onde o contêiner passa objetos por nome para outros objetos, via construtores, propriedades ou métodos de fábrica. Existem várias maneiras de implementar a injeção de dependência: injeção de dependência baseada em construtor, injeção de dependência baseada em setters e injeção de dependência baseada em campo.
Busca de dependência Busca de dependência é um padrão onde um chamador pede ao objeto contêiner um objeto com um nome específico ou de um tipo específico.
Autowiring O Spring Framework tem um recurso conhecido como autowiring, que usa o contêiner Spring para satisfazer automaticamente as dependências especificadas nas propriedades JavaBean para objetos do tipo apropriado na fábrica atual. Isso só pode ocorrer se houver apenas um objeto com o tipo apropriado.
Existem várias anotações que podem ser usadas para autowiring de POJOs, incluindo a anotação específica do Spring @Autowire (bem como várias outras anotações específicas do Spring que ajudam a resolver ambiguidade de autowiring, como as anotações @Qualifier ou @Primary), e as anotações Java padrão @Resource e @Inject.
A anotação @Qualifier pode ser usada em uma classe que define um bean para informar ao Spring que priorize a criação do bean ao fazer autowiring por nome.
A anotação @Primary pode ser usada em uma classe que define um bean para informar ao Spring que priorize a criação do bean ao fazer autowiring por tipo.
A anotação @Resource é uma anotação que está em conformidade com o JSR 250, ou Common Annotations for the Java Platform, e é usada para autowiring de referências a POJOs por nome.
A anotação @Inject é uma anotação que está em conformidade com o JSR 300, ou Standard Annotations for injection, e é usada para autowiring de referências a POJOs por tipo.
Framework de programação orientada a aspectos
O Spring Framework tem seu próprio framework de programação orientada a aspectos (AOP) que modulariza preocupações transversais em aspectos. A motivação para criar um framework AOP separado é fornecer recursos básicos de AOP sem muita complexidade no design, implementação ou configuração. O framework Spring AOP aproveita ao máximo o contêiner Spring.
O framework Spring AOP é baseado no padrão proxy. Ele é configurado em tempo de execução. Isso elimina a necessidade de uma etapa de compilação ou tecelagem em tempo de carga. 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 ao framework 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 de ponto de corte é 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 de transações declarativo e injeção de dependência via tecelagem em tempo de compilação ou tempo de carga do AspectJ. A SpringSource usa o AOP do AspectJ em outros projetos Spring, como Spring Roo e Spring Insight, com o Spring Security oferecendo uma biblioteca de aspectos baseada em AspectJ.
O Spring AOP foi projetado para trabalhar com preocupações transversais dentro do Spring Framework. Qualquer objeto que é criado e configurado pelo contêiner pode ser enriquecido usando Spring AOP.
Desde a versão 2.0 do framework, o Spring fornece duas abordagens para a configuração AOP: abordagem baseada em esquemaSpring AOP XML Configuration e estilo de anotação baseado em @AspectJ.AspectJ Annotation Configuration
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context