Atenção: esse artigo tem um vídeo complementar. Clique e assista!

De que se trata o artigo:

O artigo apresenta uma nova perspectiva sobre as novidades do Spring Framework 3.0 através de exemplos, avalia os impactos das novas funcionalidades e compara-as com a Java EE 6.


Para que serve:

O objetivo do artigo é informar e explicar ao leitor, de forma objetiva, como as novidades do Spring 3.0 podem ajudar em projetos novos ou existentes.


Em que situação o tema é útil:

É uma base para leitores que pretendem migrar suas aplicações para a nova versão, bem como para aqueles que irão iniciar novos projetos utilizando os novos recursos.

Spring 3.0: Uma nova perspectiva:

O Spring 2.5 usou das funcionalidades do Java 5 para trazer injeção de dependências por anotações. Nesta versão podemos notar um esforço para manter-se compatível com a Java EE, por exemplo, suportando várias anotações das novas JSRs.

A versão 3.0 pode ser vista com uma continuação do trabalho feito na versão 2.5. As meta-annotations, por exemplo, permitem combinar o uso de várias anotações de uma vez. O suporte a JSR 330 (Common Annotations for Dependency Injection) padroniza as anotações para inversão de controle, eliminando a dependência com o Spring. O Spring MVC ganhou um novo namespace e passou a suportar a JSR 303 (Bean Validation).

Novas funcionalidades também foram adicionadas. A Java Configuration é uma opção para configurar o container utilizando código fonte Java com anotações, ao invés do tradicional XML. A Spring EL (SpEL) é uma versão melhorada da Unified EL (JSP e JSF) e é suportada tanto em nível de XML como anotações. Por fim, o Spring MVC ganhou um excelente suporte a REST e o novo RestTemplate permite a criação de clientes para serviços REST de forma muito prática.

O Spring Framework tem continuamente se esforçado para melhorar a produtividade no desenvolvimento de aplicações corporativas, com soluções simples e não-intrusivas para problemas complexos. O framework já passou por duas versões com modificações mais drásticas: Spring 2.0, lançada em outubro de 2006 e Spring 2.5, lançada em novembro de 2007.

O lançamento da versão 2.5 tomou proveito das funcionalidades do Java 5 para trazer melhorias como a injeção de dependências por anotações. As antigas hierarquias de classes utilizadas em testes de unidade e controladores MVC foram substituídas. Além disso, surgiu uma boa sinergia entre o framework e a plataforma Java EE 5, como a integração com EJB 3 e a JSR 250 (Common Annotations for Java). Por fim, a excelente integração com o AspectJ finalmente populariza a programação orientada a aspectos no nível do desenvolvedor de aplicações.

A nova versão 3.0 procura fortalecer ainda mais a integração do framework com a plataforma Java EE, trazendo suporte antecipado à JSF e JPA 2.0 e a integração nativa com as JSRs 330 (Common Annotations for Dependency Injection) e 303 (Bean Validation). Além disso, a plataforma ainda continua compatível com a Java EE 1.4 e 5. Outras novidades que se destacam são a introdução da Spring Expression Language (SpEL) e o suporte a REST, adicionado no topo do framework MVC.

O objetivo deste artigo é apresentar uma nova perspectiva sobre as principais alterações e novas funcionalidades do Spring 3.0, apresentando exemplos práticos quando necessário.

Para entendimento de algumas funcionalidades da nova versão é necessário ter familiaridade com a versão 2.5. Caso o leitor já estiver utilizando esta versão, sinta-se a vontade para pular a próxima seção.

Revisando o Spring 2.5

O Spring 3.0 é uma continuação natural do que foi elaborado na versão 2.5. Dessa forma, é importante revisarmos rapidamente algumas de suas funcionalidades.

Component-scanning

Component-scanning é um novo recurso do Spring 2.5 para procurar no classpath quais classes possuem anotações que interessam ao framework. Normalmente definimos um pacote base para que o Spring procure todas as classes anotadas dentro dele. Para isso, utilizamos o seguinte trecho no application context:


  <context:component-scan base-package=“br.com.javamagazine"/>

Injeção de dependências por anotações

A introdução das anotações @Autowired e @Qualifier deram ao Spring uma nova alternativa em relação à injeção de dependências. Agora a configuração XML só se torna necessária para recursos externos, como data-sources, etc. No controle de transações a anotação @Transactional, introduzida ainda no Spring 1.2, é semelhante à anotação @TransactionAttribute introduzida no EJB 3. De fato, o Spring também se tornou compatível com as anotações introduzidas com a Java EE 5. Por exemplo, as anotações @Resource, @PostConstruct, @PreDestroy, @PersistentContext, etc., se comportam exatamente da mesma maneira.

Além disto, foram introduzidas as anotações “stereotypes”, como @Controller, @Service e @Repository (utilizada para demarcar Data Access Objects). Estas anotações “estendem” a anotação mais genérica @Component. O objetivo destas é anotar os componentes de sua aplicação para serem detectados automaticamente por component-scanning. Ou seja, o Spring procura as classes com as anotações “stereotypes” e, em seguida, as classes detectadas são expostas como beans para o container, podendo ser utilizadas para injeção de dependências. Veja um exemplo das anotações na Listagem 1.

Note que as anotações @Controller, @Service e @Repository representam as camadas de uma arquitetura web tradicional. Estas anotações são úteis para criação de aspectos com AOP, dado que identificam claramente onde as camadas começam e terminam.

Listagem 1. Exemplo das anotações do Spring 2.5.


  @Service
  public class RewardNetworkService implements RewardNetwork {
    @Autowired
    private AccountRepository accountRepository;
   
    @Transactional(readOnly = true)
    public Reward findRewardForAccount(int accountId) {
      return this.accountRepository.findReward(accountId);
    }
  }

TestContext Framework ...

Quer ler esse conteúdo completo? Tenha acesso completo