00 Spring

33
Recomendações para a Primeira Edição “O Spring emAção é umdestes raros livros que interligamummanual sobre o uso de determinado software com múltiplas idéias sobre bons designs de programa e padrões. Realmente gostei deste livro...” —Computing Reviews “Cobre todas as bases com inúmeros exemplos e instruções explícitas... um manual de referências e instruções muito bem organizado e escrito de maneira fluente.” —Internet Bookwatch “... fácil de ler... e com um bocado de humor para ajudar...” —Books-On-Line “Ainda que a documentação de referência de Spring seja de excelente qualidade, este livro torna a aprendizagem muito mais agradável, pois injeta a quantidade exata de humor que proporciona entretenimento. Se quiser aprender Spring,este é o caminho.” —Bill Siggelkow’s Weblog Autor de Jakarta Struts Cookbook “Uma grande fonte de pesquisa confiável... O livro define de maneira clara o poder que o Spring proporciona aos desenvolvedores e como esse abstrai muito dos serviços J2EE mais pesados que a maioria das aplicações sérias usa. Esse livro foi desenvolvido através de um rigoroso programa de acesso prévio, por isso erros de código e de gramática felizmente não existem. Para mim,não há nada pior do que tentar aprender uma nova tecnologia a partir de um texto mal-escrito ou de um livro técnico mal- editado. Felizmente Craig,Ryan e equipe da Manning tiveram o cuidado nos detalhes e produziram um livro que recomendo muito.” —JavaLobby.org “Um manual de referência completo que aborda quase todos os aspectos de Spring. E sem complicações: cada explicação é clara e há vários exemplos de código. ...Explica de maneira fácil o que “Injeção de Dependência” e AOP significam, bem como Spring os torna possíveis. ...como é possível escrever serviços e Daos, alémde implementar de maneira simples gerenciamento de transação e remotabilidade de serviços. ...a terceira parte trata da camada da web que abrange Spring MVC bem como outras tecnologias e frameworks. ...Um excelente recurso para todo desenvolvedor interessado em usar Spring em seu projeto.” —Java User Group Milano

Transcript of 00 Spring

Page 1: 00 Spring

i

Recomendações para a Primeira Edição

“O Spring em Ação é um destes raros livros que interligam um manual sobre o uso de determinado software com múlti plas idéias sobre bons designs de programa e padrões. Realmente gostei deste livro...”

—Computing Reviews

“Cobre todas as bases com inúmeros exemplos e instruções explícitas... um manual de referências e instruções muito bem organizado e escrito de maneira fluente.”

—Internet Bookwatch

“... fácil de ler... e com um bocado de humor para ajudar...”

—Books-On-Line

“Ainda que a documentação de referência de Spring seja de excelente qualidade, este livro torna a aprendizagem muito mais agradável, pois injeta a quantidade exata de humor que proporciona entretenimento. Se quiser aprender Spring, este é o caminho.”

—Bill Siggelkow’s Weblog Autor de Jakarta Struts Cookbook

“Uma grande fonte de pesquisa confiável... O livro define de maneira clara o poder que o Spring proporciona aos desenvolvedores e como esse abstrai muito dos serviços J2EE mais pesados que a maioria das aplicações sérias usa. Esse livro foi desenvolvido através de um rigoroso programa de acesso prévio, por isso erros de código e de gramática felizmente não existem. Para mim, não há nada pior do que tentar aprender uma nova tecnologia a partir de um texto mal-escrito ou de um livro técnico mal-editado. Felizmente Craig, Ryan e equipe da Manning tiveram o cuidado nos detalhes e produziram um livro que recomendo muito.”

—JavaLobby.org

“Um manual de referência completo que aborda quase todos os aspectos de Spring. E sem complicações: cada explicação é clara e há vários exemplos de código. ...Explica de maneira fácil o que “Injeção de Dependência” e AOP significam, bem como Spring os torna possíveis. ...como é possível escrever serviços e Daos, além de implementar de maneira simples gerenciamento de transação e remotabilidade de serviços. ...a terceira parte trata da camada da web que abrange Spring MVC bem como outras tecnologias e frameworks. ...Um excelente recurso para todo desenvolvedor interessado em usar Spring em seu projeto.”

—Java User Group Milano

Page 2: 00 Spring

ii Spring em Ação

Page 3: 00 Spring

iii

Spring em AçãoSegunda Edição

CRAIG WALLS

e Ryan Breidenbach

Rio de Janeiro 2008

R

Page 4: 00 Spring

iv Spring em Ação

Spring Em Ação

Do original Spring in Action, Second Edition Copyright © 2008 da Editora Alta Books Ltda.Authorized translation from English language edition, entitled Spring in Action, Second Edition, by Craig walls, published by ©2008 by Manning Publications Co.This translation is published and sold by permission of Manning Publications Co, the owner of all rights to publish and sell the same. PORTUGUESE language edition published by Editora Alta Books, Copyright © 2008 by Editora Alta Books.

Todos os direitos reservados e protegidos pela Lei 5988 de 14/12/73. Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrônico, mecânico, fotográfi co, gravação ou quaisquer outros. Todo o esforço foi feito para fornecer a mais completa e adequada informação, contudo a editora e o(s) autor(es) não assumem responsabilidade pelos resultados e usos da informação fornecida. Recomendamos aos leitores testar a informação, bem como tomar todos os cuidados necessários (como o backup), antes da efetiva utilização. Este livro não contém CD-ROM, disquete ou qualquer outra mídia.

Erratas e atualizações: Sempre nos esforçamos para entregar a você, leitor, um livro livre de erros técnicos ou de conteúdo; porém, nem sempre isso é conseguido, seja por motivo de alteração de software, interpretação ou mesmo quando alguns deslizes constam na versão original de alguns livros que traduzimos. Sendo assim, criamos em nosso site, www.altabooks.com.br, a seção Erratas, onde relataremos, com a devida correção, qualquer erro encontrado em nossos livros.

Avisos e Renúncia de Direitos: Este livro é vendido como está, sem garantia de qualquer tipo, seja expressa ou implícita.

Marcas Registradas: Todos os termos mencionados e reconhecidos como Marca Registrada e/ou comercial são de responsabilidade de seus proprietários. A Editora informa não estar associada a nenhum produto e/ou fornecedor apresentado no livro. No decorrer da obra, imagens, nomes de produtos e fabricantes podem ter sido utilizados, e desde já a Editora informa que o uso é apenas ilustrativo e/ou educativo, não visando ao lucro, favorecimento ou desmerecimento do produto/fabricante.

Produção Editorial: Editora Alta BooksCoordenação Editorial: Thalita Aragão Ramalho

Tradução: Pricila Reiz Franz e Leandro ChuRevisão: Michele Paiva

Revisão Técnica: Rodrigo AmorimDiagramação: Patricia Ishiara

Impresso no Brasil

O código de propriedade intelectual de 1º de Julho de 1992 proíbe expressamente o uso coletivo sem autorização dos detentores do direito autoral da obra, bem como a cópia ilegal do original. Esta prática generalizada nos estabelecimentos de ensino, provoca uma brutal baixa nas vendas dos livros a ponto de impossibilitar os autores de criarem novas obras.

Rua Viúva Cláudio, 291 – Jacaré Rio de Janeiro – RJ. CEP: 20970-031Tel: 21 3278-8069/ Fax: 3277-1253

www.altabooks.com.bre-mail: [email protected]

R

Page 5: 00 Spring

v

Para minha esposa Raymie e minhas filhas, Maisy e Madison

Eu estou eternamente maravilhado por merecer o amor das três mais belas garotas do mundo.

Page 6: 00 Spring

vi Spring em Ação

conteúdo resumido

Parte 1 Elementos Essenciais do Spring.........................................1

1 Como colocar Spring em ação 3

2 Associação básica de bean 25

3 Associação avançada de bean 57

4 Como advertir beans 91

Parte 2 Spring na camada de negócios .............................................121

5 Como acessar o banco de dados 123

6 Como gerenciar transações 175

7 Como assegurar aplicações Spring 197

8 Spring e serviços remotos com base em POJO 243

9 Como desenvolver serviços web com contrato pré-defi nido (contract-fi rst) em Spring 275

10 Como transmitir mensagens Spring 307

11 Spring e Enterprise JavaBeans 337

12 Como acessar serviços corporativos 351

Part 3 Spring no lado cliente ..................................................387

13 Como tratar requisições web 389

14 Como fazer a renderização de views web 425

15 Como utilizar o Spring Web Flow 463

16 Como trabalhar com outros frameworks web 497

Apêndice A Como configurar o Spring 531

Apêndice B Como realizar testes com (e sem) Spring 541

Índice remissivo 557

Page 7: 00 Spring

vii

SumárioPrefácio xvPrefácio para a Primeira Edição xviiAgradecimentos xixSobre este livro xxSobre o título xxivSobre a ilustração de capa xxv

Parte 1 Elementos Essenciais do Spring........................................1

1 Como colocar Spring em ação 3

1.1 O que é Spring? 5 Módulos do Spring 6

1.2 O início com Spring 9

1.3 Como entender a injeção de dependência 11Injetação de dependências 11 Injeção de dependências em ação 12 Injeção de dependência em aplicativos corporativos 17

1.4 Aplicação de programação orientada a aspecto 19 Introdução a AOP 19 AOP em ação 21

1.5 Resumo 24

2 Associação básica de bean 25

2.1 Como pôr seus beans no container 26Introdução ao BeanFactory 27 Como trabalhar com um contexto de aplicação 29A vida de um bean 30

2.2 Como criar beans 32Como declarar um bean simples 33 Como injetar através de construtores 34

2.3 Como injetar em propriedades de bean 37Como injetar valores simples 38 Como referenciar outros beans 39 Associação de coleções 41 Associação vazia (nul l) 46

2.4 Associação automática 47Os quatro ti pos de associação automática 47 Como misturar associação automática com explícita 50 Associar ou não de maneira automática 51

Page 8: 00 Spring

viii Spring em Ação

2.5 Como controlar criação de bean 51Como delimitar bean 51 Criação de beans a partir de métodos de fábrica 53 Como inicializar e destruir beans 54

2.6 Resumo 56

3 Associação avançada de bean 57

3.1 Como declarar beans de pai e fi lho 58Como extrair um ti po de bean básico 58 Como extrair propriedades comuns 60

3.2 Como aplicar injeção de métodos 62Substituição básica de método 63 Como utilizar injeção getter 66

3.3 Como injetar beans que não são Spring 67

3.4 Como registrar editores personalizados de propriedade 69

3.5 Como trabalhar com beans especiais do Spring 72Pós-processamento de beans 73 Pós-processamento da fábrica de bean 75

Externalização de propriedades de configuração 75 Como resolver mensagens de texto 77 Como desacoplar com eventos de aplicação 79Como criar beans conscientes (beans aware) 81

3.6 Como fazer script de beans 83Como colocar o limão na cai pirinha 84 Como fazer scri pt de um bean 85 Injeção de propriedades de beans com scri pt 87 Atualização de beans com scri pt 88 Como escrever beans com scri pt in-line 88

3.7 Resumo 89

4 Como advertir beans 91

4.1 Introdução a AOP 93 Como definir a terminologia da AOP 93 Suporte para AOP do Spring 96

4.2 Como criar aspectos clássicos do Spring 98Como criar advice 100 Como definir pointcuts e advisors 104 Utilização de ProxyFactoryBean 106

4.3 Autoproxying 109Como criar autoproxies para aspectos do Spring 110 ■ Autoproxying de aspectos @AspectJ 110

4.4 Declaração de aspectos POJO puros 113

4.5 Como injetar aspectos AspectJ 117

4.6 Resumo 119

Page 9: 00 Spring

ix

Parte 2 – Spring na camada de negócios ...............................................121

5 Como acessar o banco de dados 123

5.1 Como aprender a fi losofi a do acesso a dados do Spring 124Como entender uma hierarquia de exceção do acesso a dados do Spring 126Como padronizar o acesso a dados 128Utilização de classes de suporte a DAO 130

5.2 Como confi gurar uma fonte de dados 131Utilização de fontes de dados JNDI 132 Utilização de uma fonte de dados em pool 133 Fonte de dados com base em driver JDBC 134

5.3 Utilização de JDBC com Spring 135O problema com o código JDBC 135 Como trabalhar com modelos JDBC 138 ■ Como usar classes de suporte a DAO do Spring para JDBC 143

5.4 Como integrar Hibernate com Spring 145Como escolher uma versão de Hibernate 147Como utilizar modelos de Hibernate 147Como desenvolver DAOs com base em Hibernate 151Como usar sessões contextuais de Hibernate 3 152

5.5 Spring e Java Persistence API 154Como usar modelos JPA 154 Como configurar uma fábrica de gerenciador de entidade 156 Como desenvolver um DAO com base em JPA 160

5.6 Spring e iBATIS 161Como configurar um modelo de cliente iBATIS 161 Como desenvolver DAO com base em iBATIS 164

5.7 Realização de cache 165Como configurar uma solução de realização de cache 167 Como realizar proxy de beans para cache 170 Cache dirigido a anotações 172

5.8 Resumo 173

6 Como gerenciar transações 175

6.1 Como entender as transações 176 Como explicar transações em apenas quatro palavras 177 Como entender o suporte de gerenciamento de transações do Spring 178

6.2 Como escolher um gerenciador de transações 179Transações JDBC 180 Transações Hibernate 180Transações Java Persistence API 181 Transações Java Data Objects 182Transações API Java Transaction 182

6.3 Como programar transações em Spring 182

6.4 Como declarar transações 185

Page 10: 00 Spring

x Spring em Ação

Como definir atributos de transação 185 Como realizar proxy de transações 189 ■ Como declarar transações em Spring 2.0 192 ■ Como definir transações dirigidas a anotações 194

6.5 Resumo 195

7 Como assegurar aplicações Spring 197

7.1 Introdução a Spring Security 198

7.2 Como autenticar usuários 201Como configurar um gerenciador de provedor 202 Como autenticar em um banco de dados 204 Como autenticar em um repositório de LDAP 211

7.3 Como controlar o acesso 216Como votar decisões de acesso 216 Como escolher um voto de decisão de acesso 217 Como tratar abstinência de um votante 218

7.4 Como assegurar aplicações web 219Como fazer proxy dos filtros de Spring Security 222 Como tratar o contexto de segurança 227 Como solicitar ao usuário para realizar login 228 Como tratar exceções de segurança 232 Como reforçar a segurança na web 234 Como garantir um canal seguro 235

7.5 Segurança da camada de visão 237Conteúdo renderizado condicionalmente 238 Como exibir informações de autenticação de usuário 239

7.6 Como assegurar invocações de método 240Como criar um aspecto de segurança 240Como assegurar métodos utilizando metadados 241

7.7 Resumo 242

8 Spring e serviços remotos com base em POJO 243

8.1 Uma visão geral do remotabilidade do Spring 244

8.2 Como trabalhar com RMI 247Como associar serviços RMI 247 Como exportar serviços RMI 249

8.3 Remotabilidade com Hessian e Burlap 252Como acessar os serviços Hessian/Burlap 252Como expor a funcionalidade de um bean com Hessian/Burlap 254

8.4 Como utilizar HttpInvoker do Spring 257Como acessar serviços via HTTP 257 Como expor beans como serviços HTTP 258

8.5 Spring e serviços web 260 Como exportar beans como serviços web usando XFire 260 Como declarar serviços web com anotações JSR-181 263 Como consumir serviços web 266 Como realizar proxy de serviços web com um cliente XFire 271

8.6 Resumo 272

Page 11: 00 Spring

xi

9 Como desenvolver serviços web com contrato pré-defi nido (contract-fi rst) em Spring 275

9.1 Introdução a Spring-WS 277

9.2 Defi nição do contrato (primeiro!) 278Como criar mensagens XML de exemplo 279

9.3 Como tratar mensagens com endpoints de serviço 283Como desenvolver uma mensagem endpoint com base em JDOM 284 ■ Como organizar carregamentos de mensagens 286

9.4 Associação de todos juntos 288Spring-WS: Visão global 289 Como mapear mensagens para endpoints 290 ■ Como realizar associações com endpoint de serviço 291 Como configurar um organizador de mensagem 291 Como tratar exceções endpoint 293 Como servir arquivos WSDL 295 Como instalar o serviço 298

9.5 Como consumir serviços web Spring-WS 298Como trabalhar com modelos de serviços web 299 ■ Utilização de suporte a gateway do serviço web 305

9.6 Resumo 306

10 Como transmitir mensagens Spring 307

10.1 Uma breve introdução a JMS 308Como fazer arquitetura JMS 309 Avaliação dos benefícios de JMS 311Como configurar ActiveMQ em Spring 313

10.2 Como utilizar JMS com Spring 314O problema com o código JMS 314 Como trabalhar com modelos JMS 315 Como converter mensagens 321 Utilização de classes de suporte a gateway do Spring por JMS 323

10.3 Como criar POJOs dirigidos a mensagem 325Criação de um listener de mensagem 326Como escrever MDPs ti po POJO puro 328

10.4 Utilização de RPC com base em mensagem 331Introdução a Lingo 332 Exportação do serviço 333Como realizar proxy de JMS 334

10.5 Resumo 336

11 Spring e Enterprise JavaBeans 337

11.1 Como acessar EJBs no Spring 338Como fazer proxy em beans de seção (EJB 2.x) 339 ■

Page 12: 00 Spring

xii Spring em Ação

Como conectar EJBs aos beans do Spring 343

11.2 Como desenvolver EBJs (EJB 2.x) habilitadas no Spring 343

11.3 Spring e EJB 3 346Introdução ao Pitchfork 346 Pitchfork 347 Como injetar recursos via anotação 348 Como declarar interceptores através de anotações 349

11.4 Resumo 350

12 Como acessar serviços corporativos 351

12.1 Como associar objetos do JNDI 352Como trabalhar com o JNDI convencional 353 Como injetar objetos JNDI 355 ■ Como associar objetos JNDI no Spring 2 357

12.2 Como enviar e-mails 358Como configurar um emissor de e-mail 358 Como criar o e-mail 360

12.3 Como agendar tarefas 363Como agendar com o Timer do Java 363 Como utilizar o Quartz scheduler 365 ■ Como chamar métodos em um agendamento 369

12.4 Como gerenciar beans com o JMX 371Como exportar beans do Spring como MBeans 372 Acesso remoto a MBeans 380 ■ Como tratar notificações 383

12.5 Resumo 386

Parte 3 Spring no lado cliente........................................................387

13 Como tratar requisições web 389

13.1 Introdução ao MVC do Spring 390Um dia na vida de uma requisição 390 Como configurar o DispatcherServlet 392 ■ Guia essencial do MVC do Spring 394

13.2 Como mapear requisições para controllers 399Como utilizar o SimpleUrlHandlerMapping 400 Como utilizar o Control lerClassNameHandlerMapping 401 Como utilizar metadados para mapear controladores 401 Como trabalhar com vários mapeamentos de controladores 402

13.3 Como gerenciar requisições com os controllers 403Como processar comandos 405 Como processar submissões de formulários 407Como processar formulários complexos com assistentes 414■Como trabalhar com control lers throwaway 420

13.4 Tratamento de exceções 422

13.5 Resumo 423

Page 13: 00 Spring

xiii

14 Como fazer a renderização de views web 425

14.1 Como determinar as views 426Como utilizar views template 427 Como determinar beans view 429Como escolher um determinador de view 431

14.2 Como utilizar templates JSP 432Como fazer a associação dos dados do formulário 432■ Como exibir mensagens externalizadas 434 Como exibir erros 436

14.3 Como modelar o layout das páginas com Tiles 438Views Tile 438 Como criar control lers de Tile 441

14.4 Como trabalhar com alternativas à JSP 443Como utilizar templates Velocity 443 Como trabalhar com o FreeMarker 449

14.5 Como gerar saída não-HTML 453Como criar planilhas do Excel 453 Como gerar documentos PDF 456■ Como desenvolver visualizações personalizadas 458

14.6 Resumo 460

15 Como utilizar o Spring Web Flow 463

15.1 Introdução ao Spring Web Flow 465Como instalar o Spring Web Flow 466 Princípios básicos do Spring Web Flow 469 ■ Como criar um fluxo 471

15.2 Como construir a base do fl uxo 471Variáveis de fluxo 472 Estados de início e de fim 473■ Como coletar as informações do cliente 474 Como criar um pedido de pizza 479 Como finalizar o pedido 482 Alguns toques finais 484

15.3 Técnicas avançadas de fl uxos para a web 487Como utilizar os estados de decisão 488Como extrair subfluxos e utilizar sub-estados 489

15.4 Como integrar o Spring Web Flow a outros frameworks 493Jakarta Struts 493 JavaServer Faces 494

15.5 Resumo 495

16 Como trabalhar com outros frameworks web 497

16.1 Como usar o Spring com o Struts 498Como registrar o plug-in do Spring com o Struts 500 Como declarar actions do Struts que enxerguem o Spring 500 Como delegar actions 502 E o Struts 2? 504

16.2 Como integrar o Spring ao WebWork 2/Struts 2 505

Page 14: 00 Spring

xiv Spring em Ação

16.3 Como integrar o Spring ao Tapestry 507Como integrar o Spring ao Tapestry 3 508 Como integrar o Spring ao Tapestry 4 511

16.4 Como integrar o Spring ao JSF 512Como configurar as propriedades controladas pelo JSF 513 Como configurar os beans do Spring 515 Como usar os beans do Spring em páginas JSF 515Como exportar o contexto do aplicativo no JSF 516

16.5 Aplicativos habilitados Ajax no Spring com o DWR 517Acesso remoto direto pela web 518Como acessar beans do DWR controlados pelo Spring 525

16.6 Resumo 529

Apêndice A: Como confi gurar o Spring 531

Apêndice B: Como realizar testes com (e sem) o Spring 541

Índice remissivo 563

Conteúdo da web (Os tópicos à seguir estão disponíveis em inglês no site: www.altabooks.com)

Capítulo da web Construção de aplicações portlet

Apêndice C Referência de confi guração de XML do Spring

Apêndice D Referência de biblioteca de tag JSP do Spring

Apêndice E Referência de defi nição Spring Web Flow

Apêndice F Personalização de confi guração do Spring

Page 15: 00 Spring

xv

Prefácio

Eu estava ao lado de um centro de convenções de um amplo hotel, em Miami Beach, Flórida, no dia 7 de dezembro de 2005. O centro estava lotado de desenvolvedores de todos os lugares do mundo, que tinham invadido as lindas areias das praias do sul da Flórida com um único propósito: falar sobre Spring.Que posso dizer? Era uma sala cheia de nerds. Em lugar de surf e bronzeados ao sol, nos juntamos para nos aquecer no brilho morno das telas de nossos laptops, para aprender mais sobre nosso querido framework, do qual cada um sabe mais que o outro.Naquela noite em particular, esperávamos as palavras do criador do Spring, Rod Johnson, que apresentou a palestra de abertura da conferência. Ele falou sobre a origem do Spring e o sucesso que tinha obtido. A seguir, convidou alguns membros da equipe do Spring para o palco para apresentar as novas funcionalidades que estariam na próxima versão.Não havia avançado muito na apresentação quando Rod pediu que todos prestassem muita atenção. Todos fi camos na expectativa de excelentes novas funcionalidades a serem disponibilizadas no Spring 1.3, a suposta nova versão. Para nossa grande surpresa, Rod nos disse que não haveria Spring 1.3; a próxima versão seria Spring 2.0.A decisão de aumentar o número principal da versão do próximo lançamento não é tomada de forma leviana. Tal ação denota um avanço signifi cativo em Spring. Se a próxima versão seria 2.0, então podíamos esperar melhorias principais. De fato, dez meses mais tarde, o Spring 2.0 foi lançado com uma abundância de novas habilidades, incluindo:

Confi guração de XML simplifi cada e a opção de criar elementos personalizados de confi guração AOP e transações muito simplifi cadas Suporte para anotações Java 5 para declarar aspectos, transações e propriedades

exigidas do bean A habilidade para criar beans a partir de scripts escritos em JRuby, Groovy ou

Bean-Shell

Novos modelos JDBC para dar suporte a parâmetros nomeados e recursos Java 5 Suporte aprimorado para JMS, incluindo recebimento de mensagens de maneira

não-sincronizada (para a criação de POJOs dirigidos a mensagens) Uma nova biblioteca de tags JSP para binding de formulários Diversas melhorias em confi guração sobre convenção para reduzir a quantidade

de XML exigido para confi gurar Spring Suporte para Java Persistence API (JPA) Defi nição aprimorada de bean, incluindo delimitação de pedido e seção de beans

para aplicações da web A habilidade para executar injeção de dependência sobre objetos que o Spring

não cria (como objetos de domínio)Em certo ponto de sua apresentação, Rod disse que se a profusão de novos recursos a serem introduzidos não justifi cava o salto para 2.0, como poderiam estar aptos para justifi car o lançamento 2.0?

Page 16: 00 Spring

xvi Spring em Ação

Isto não era tudo. Além do trabalho feito no núcleo de Framework Spring, vários projetos interessantes relacionados com o Spring estavam por trás para fornecer habilidades adicionais. Entre elas:

Spring Web Flow, que tem base no Spring MVC e permite o desenvolvimento de aplicações da web com base em fl uxos

XFire, para exportar seus beans do Spring como serviços da web SOAP

Spring-WS para criar serviços da web com contratos pré-defi nidos

Spring Modules, que fornece (entre outras coisas) realização de cache declarativo e validação

Direct Web Remoting (DWR) para beans do Spring habilitados por Ajax

Lingo, que torna possível invocar de maneira não-sincronizada métodos sobre bean remotos

Então tive a seguinte idéia: se todos esses novos avanços não justifi cavam uma segunda edição do Spring em Ação, o que justifi caria? Descobri que a Manning estava pensando a mesma coisa.

E agora, depois de um ano, aqui está a tão esperada atualização do Spring em Ação, que abrange muitos dos novos recursos do Spring 2.0. Esse trabalho foi um pouco mais longo do que havia planejado, mas espero que tenha valido a pena esperar. Meu objetivo para esta edição é o mesmo da primeira: compartilhar a alegria de desenvolver em Spring. Espero que este livro sirva para reforçar seu prazer em Spring.

Page 17: 00 Spring

xvii

Prefácio para a primeira edição

Os desenvolvedores de software precisam ter diversas características de maneira a fazer bem o seu trabalho. Em primeiro lugar, devem ser bons pensadores analíticos e solucionadores de problemas. O principal papel de um desenvolvedor é criar softwares que solucionem problemas comerciais. Isto exige conhecer as necessidades do cliente e apresentar soluções criativas e bem-sucedidas.

Também precisam ser curiosos. Os desenvolvimentos na indústria de software são alvos móveis, que estão sempre em evolução. Novos frameworks, técnicas, linguagens e metodologias emergem constantemente. Cada qual é um nova ferramenta que precisa ser dominada e incluída na caixa de ferramentas, permitindo ao desenvolvedor realizar melhor e de maneira mais rápida o seu trabalho.

Em seguida há a característica mais apreciada de todas — a “preguiça”. O tipo de preguiça que motiva desenvolvedores a trabalharem arduamente para encontrar soluções com a menor quantidade de esforço. Foi com curiosidade, uma boa dose de “preguiça” e todas as capacidades analíticas que pudemos conseguir reunir, que dois de nós pesquisaram juntos por quatro anos para encontrar novas maneiras de desenvolver software.

Foi a época em que o software de código aberto estava alcançando uma massiva crítica na comunidade Java. Toneladas de frameworks de código aberto estavam fl orescendo no cenário Java. Para decidir qual adotar, era preciso que atingisse o ponto exato de nossas necessidades – tinha de fazer 80% do que precisávamos imediatamente. E para qualquer funcionalidade que não fosse imediata, o framework precisava ser facilmente extensível de maneira que essa pudesse ser incluída. Estender não signifi cava colocar um remendo que fosse tão feio a ponto de você depois se sentir sujo — signifi cava estender em um estilo elegante. Isso não era pedir muito, certo?

O primeiro destes frameworks que ganhou adoção imediata de nossa equipe foi o Ant. Desde o princípio, podíamos dizer que o Ant fora criado por outro desenvolvedor que conhecia nosso sofrimento em construir aplicações Java. A partir daquele momento, nunca mais javac. Nunca mais CLASSPATH. Tudo isto com uma confi guração XML direta (embora, às vezes, prolixa). Iupi! A vida (e a compilação) tornou-se muito mais fácil.

Conforme prosseguíamos, começamos a adotar mais e mais ferramentas. O Eclipse tornou-se a nossa opção de IDE. Log4J transformou-se nosso (e de outros mais) kit de ferramentas padrão de realização de logon. E Lucene suplantou nossa solução de pesquisa comercial. Cada uma dessas ferramentas correspondia aos nossos critérios de preenchimento de uma necessidade, ao mesmo tempo em que era fácil de usar, entender e estender.

Mas algo estava faltando. Essas excelentes ferramentas eram projetadas para ajudar a desenvolver software, como Ant e Eclipse, ou para servir a uma necessidade muito específi ca da aplicação, como a pesquisa, no caso de Lucene, e de realização de logon, em Log4J. Nenhuma delas destinava-se às necessidades no coração das aplicações empresariais: persistência, transações e integração com outros recursos da empresa.

Page 18: 00 Spring

xviii Spring em Ação

Tudo isso mudou lá pelo ano passado, quando descobrimos o notável potencial corporativo de Spring e Hibernate. Entre esses dois frameworks, quase todas as nossas necessidades de camadas intermediárias e de dados foram correspondidas.

Primeiro adotamos o Hibernate. Era a ferramenta de mapeamento de objeto/relacional mais intuitiva e rica em recursos por aí afora. Mas foi ao adotar o Spring que realmente conseguimos com que o nosso código parecesse bom. Com a injeção de dependência do Spring conseguimos nos livrar de todos os nossos fabricantes e configuradores personalizados. De fato, esta foi a razão pela qual integramos em primeiro lugar o Spring em nossas aplicações. Sua conexão permitiu-nos modernizar a confi guração de nossas aplicações e abandonar as soluções domésticas. (Hei, todo o desenvolvedor gosta de escrever seu próprio framework. Mas algumas vezes você precisa simplesmente renunciar a isto!)

Rapidamente descobrimos um excelente bônus: o Spring também fornecia integração bastante fácil com o Hibernate. Isto nos permitiu descartar nossas classes de integração personalizadas do Hibernate e usar o suporte do Spring em seu lugar. Por sua vez, conduziu-nos diretamente ao suporte do Spring para persistência transparente.

Observe atentamente e você verá um padrão aqui. Quanto mais usávamos Spring, mais descobríamos novos recursos. E cada recurso descoberto era um prazer de se trabalhar. Seu framework MVC web funcionava perfeitamente com algumas aplicações. Seu suporte para AOP foi útil em diversos lugares, principalmente na segurança. O suporte a JDBC foi bastante apropriado para alguns programas menores. Ah, é claro, também o usamos para o planejamento. E acesso a JNDI. E integração de e-mail. Quando isto atinge os pontos principais do desenvolvimento, o Spring ganha de goleada.

Gostamos tanto do Spring que decidimos que alguém deveria escrever um livro sobre ele. Felizmente, um de nós já havia escrito um livro para a Manning e sabia como ir adiante neste tipo de coisa. Logo aquela expressão “alguém deveria escrever um livro” tornou-se nós. Ao assumir este projeto, tentamos divulgar a palavra divina do Spring. O framework Spring trouxe-nos somente satisfação ao trabalhar com ele – prevemos que o mesmo ocorrerá com você. E esperamos que este livro seja um agradável veículo para você atingir esse ponto.

Page 19: 00 Spring

xix

Agradecimentos

Uau! Levou muito mais tempo para fazer este livro do que pensei que levaria. Mas não havia outra maneira de você estar com esse exemplar nas mãos se não fosse a ajuda, inspiração e estímulo de todo o pessoal por trás dos panos.

Em primeiro lugar, gostaria de agradecer às almas trabalhadoras da Manning que milagrosamente trans-formaram o meu manuscrito escrito de maneira negligente na fi na peça de literatura de programação que chega até você: Marjan Bace, Mary Piergies, Cynthia Kane, Dottie Marsico, Karen Tegtmeyer, Leslie Haimes, Liz Welch, Gabriel Dobrescu, Ron Tomich, Kerri Bonasch, Jackie Carter, Frank Blackwell, Michael Stephens e Benjamin Berg.

Também gostaria de agradecer aos revisores que dependeram tempo para fornecer o feedback e a crítica necessária para dar forma a este livro: Doug Warren, Olivier Jolly, Matthew Payne, Bill Fly, Jonathon Esterhazy, Philip Hallstrom, Mark Chaimungkalanont, Eric Raymond, Dan Allen, George M. Jempty, Mojahedul Hasanat, Vlad Kofman, Ashik Uzzaman, Norman Richards, Jeff Cunningham, Stuart Caborn, Patrick Dennis, Bas Vodde e Michael Masters. Além disso, Erik Weibust e Valentin Crettaz fi zeram uma segunda revisão técnica do manuscrito, um pouco antes de ser publicado.

E há aquelas pessoas que não trabalharam diretamente no livro, mas que nem por isso deixaram de causar impacto sobre mim ou em como esse livro foi produzido.

A minha melhor amiga, esposa amante e a mulher mais bonita do mundo, Raymie. Muito obrigado por sua eterna paciência em outro projeto de livro que parecia não ter mais fi m. Desculpe se de-morou tanto. Agora que acabou, prometo-lhe mais fl ores e encontros. E quem sabe algum trabalho no jardim.

Às minhas doces e adoráveis garotinhas, Maisy e Madison: Obrigado pelos abraços, risadas e intervalos que me proporcionaram uma pausa agradável do livro.

A Ryan Breidenbach, meu co-autor na primeira edição: Muito obrigado por me ajudar no início e pelo seu feedback na segunda edição.

À equipe do Spring: Nenhuma parte desse livro seria possível (ou mesmo necessária) sem a visão de vocês e a determinação em criar um framework tão impressionante. Gostaria de agradecer especialmente a Rod Johnson e Colin Sampaleanu por seus comentários no meu blog e nas seções IM que ajudaram a guiar meu pensamento, assim como Arjen Poutsma pela revisão do capítulo sobre Spring-WS.

A todos os meus colegas de trabalho durante os últimos anos: aprendi muitas coisas preciosas trabalhando ao lado de vocês e não posso deixar de agradecer pelo seu profi ssionalismo, dedicação e amizade: Jeff Hanson, Jim Wallace, Don Beale, Van Panyanouvong, James Tikalsky, Ryan Breidenbach, Marianna Krupin, Tonji Zimmerman, Jeff Wellen, Chris Howard, Derek Lane, Tom McGraw, Greg Vaughn, Doug Warren, Jon West, Peter Presland-Byrne, Ravi Varanasi, Srinivasa Penubothu, Gary Edwards, Greg Helton, Jacob Orshalick, Valerie Crowley, Tyler Osborne, Stephanie Co, Maggie Zhuang, Tim Sporcic, William Johnson, John Moore, Brian Eschbach, Chris Morris, Dave Sims, Andy Cline, Bear Cahill, Greg Graham e Paul Nelson.

Um muito obrigado também a todos meus outros amigos, colegas, nerds da mesma categoria, pessoas que encontrei em conferências, membros da minha lista LinkedIn, que me subornaram para terem seus nomes nos agradecimentos: James Bell, Daniel Brookshier, Scott Davis, Ben Galbraith, Bill Fly, Justin Gehtland, Pete Gekas, Robert Gleaton, Stu Halloway, Erik Hatcher, Rick Hightower, Ramnivas Laddad, Guillaume Laforge, Crazy Bob Lee, Ted Neward, Matt Raible, Leo Ramirez, Arun Rao, Nor-man Richards, Chris Richardson, James Strachan, Bruce Tate, Glenn Vanderburg, Becca Wheeler e Jay Zimmerman.

E, fi nalmente minha gratidão infi nita ao Jack Bauer… por salvar o mundo, 24 horas de cada vez.

Page 20: 00 Spring

xx Spring em Ação

Sobre este livro

O Framework Spring foi criado com um objetivo bem específi co em mente — tornar mais fácil o desenvolvimento de aplicações JEE. Seguindo a mesma linha, Spring em Ação foi escrito para facilitar o aprendizado em usar o Spring. Meu objetivo não é oferecer a você uma lista minuciosa de APIs do Spring. Em vez disso, espero apresentar o Spring Framework da maneira que seja mais relevante para um desenvolvedor JEE, fornecendo exemplos práticos de códigos extraídos de experiências reais.

Como Spring é um framework modular, este livro foi escrito da mesma forma. Reconheço que nem todos os desenvolvedores têm as mesmas necessidades. Alguns querem aprender sobre o Framework Spring por completo, enquanto outros preferem escolher tópicos diferentes e prosseguir ao seu próprio modo. Desta forma, o livro atua como uma ferramenta de aprendizado inicial do Spring, bem como um manual e um guia de referência para aqueles que querem se aprofundar em recursos específi cos.

Guia geral

Spring em Ação - Segunda Edição está dividido em três partes, além de dois apêndices. Cada uma das três partes enfoca uma área do Framework Spring: o núcleo do framework, as camadas de negócio e de dados, além da camada de apresentação. Embora cada parte se baseie na seção anterior, cada qual pode também atuar individualmente, permitindo que você mergulhe de cabeça em um determinado tópico sem ter de partir do princípio. Na parte 1, você explorará os dois recursos centrais do framework Spring: injeção de dependência (DI) e programação orientada a aspecto (AOP). Isto dará a você uma boa compreensão dos fundamentos do Spring a serem utilizados ao longo do livro.

No capítulo 1, você será apresentado à DI e à AOP, e como elas são usadas para facilitar o desenvolvimento de aplicações em Java.

O capítulo 2 dá uma visão mais detalhada sobre como confi gurar seus objetos de aplicação, usando injeção de dependência. Você aprenderá a escrever componentes de baixo acoplamento e associar suas dependências e propriedades dentro do container do Spring usando XML.

Assim que entender o básico sobre associação de beans, você estará pronto para ver algo dos recursos mais avançados do container do Spring no capítulo 3. Entre outras coisas, aprenderá como atrelar ao ciclo de vida de seus componentes de aplicação, criar relacionamentos de pai/fi lho entre as confi gurações de seus beans, e associar em componentes script escritos em Ruby e Groovy.

O capítulo 4 explora o uso da AOP do Spring para desacoplar propriedades transversais a partir de objetos aos quais servem. Este capítulo também prepara a cena para os capítulos posteriores, em que você usará AOP do Spring para fornecer serviços declarativos, como transações, segurança e realização de cache.

A Parte 2 baseia-se nos recursos da DI e da AOP apresentados na parte 1 e mostra como aplicar esses conceitos às camadas de negócio e de dados de sua aplicação.

Page 21: 00 Spring

xxi

O capítulo 5 abrange o suporte do Spring para persistência de dados. Você será apresentado ao suporte a JDBC do Spring, que ajudará a remover muito código repetitivo associado a JDBC. Você também verá como o Spring integra-se a diversos frameworks de persistência populares como Hibernate, iBATIS e Java Persistence API (JPA).

O capítulo 6 complementa o anterior, mostrando-lhe como assegurar integridade em seu banco de dados usando o suporte de transações do Spring. Você verá como o Spring utiliza a AOP para oferecer a objetos de aplicação simples a capacidade de transações declarativas.

No capítulo 7 você aprenderá como oferecer segurança para suas aplicações usando Spring Security. Verá como Spring Security assegura a aplicação no nível de solicitação da web, usando fi ltros servlet, e no nível de método, usando a AOP do Spring.

O capítulo 8 explora como expor seus objetos de aplicação como serviços remotos. Você aprenderá a acessar serviços remotos de forma transparente como se fossem qualquer outro objeto em sua aplicação. As tecnologias remotas exploradas incluem RMI, Hessian/Burlap, serviços da web com base em SOAP, além do próprio HttpInvoker do Spring.

Ainda que o capítulo 8 aborde serviços da web em Spring, o capítulo 9 dá uma visão diferente destes, examinando o projeto Spring-WS. Neste capítulo você aprenderá como usar Spring-WS para desenvolver serviços da web com contrato pré-defi nido em que o contrato é desacoplado a partir de sua implementação. O capítulo 10 examina o Spring para enviar e receber mensagens não-sincronizadas com JMS. Além de operações básicas JMS com Spring, você aprenderá também como usar o projeto de código aberto Lingo para expor e consumir serviços remotos não-sincronizados em JMS.

Embora Spring elimine muitas das necessidades para EJBs, você pode precisar usar Spring e EJB juntos. Dessa forma, o capítulo 11 explora como integrar Spring com EJB. Você aprenderá como escrever EJBs habilitados para Spring, como associar referências EJB em seu contexto de aplicação Spring, e até como usar anotações tipo EJB para confi gurar seus beans do Spring.

Terminada a parte 2, o capítulo 12 lhe mostrará como usar o Spring para agendar tarefas, enviar e-mails, acessar recursos confi gurados para JNDI e gerenciar objetos de sua aplicação com JMX.

A parte 3 move a discussão do Spring um pouco mais próximo do usuário fi nal, vendo os modos de usar Spring para desenvolver aplicações da web.

O capítulo 13 apresenta o próprio framework web MVC do Spring. Você descobrirá como o Spring pode ligar de forma transparente parâmetros web aos seus objetos de negócios, e proporcionar controle de erros e validação ao mesmo tempo. Verá também o quão fácil é acrescentar funcionalidade às suas aplicações web, usando o rico conjunto de controles Spring.

Continuando de onde o 13 parou, o capítulo 14 abrange a camada de visão do MVC Spring. Neste capítulo, você aprenderá como mapear a produção de um controlador MVC Spring para um componente de visualização específi ca para renderizar o usuário. Você verá como defi nir visualizações de aplicação usando JSP, Velocity, FreeMarker e Tiles. Aprenderá também como criar uma saída não-HTML como PDF, Excel e RSS, a partir de MVC Spring.

O capítulo 15 explora o Spring Web Flow, uma extensão para MVC Spring que habilita o desenvolvimento de aplicações web conversacionais. Neste capítulo você aprenderá como desenvolver aplicações da web que guiarão o usuário através de um fl uxo específi co.

Finalmente, o capítulo 16 mostrará como integrar Spring a outros frameworks web. Se você

Page 22: 00 Spring

xxii Spring em Ação

já tiver feito um investimento em outro framework web (ou apenas prefere outro), este capítulo é para você. Verá como o Spring fornece suporte para diversos dos mais populares frameworks web, incluindo Struts, WebWork, Tapestry e JavaServer Faces (JSF).

O Apêndice A fará você iniciar sua aplicação, mostrando como baixar e confi gurar o Spring em Ant ou em Maven 2.

Um dos benefícios-chave de baixo acoplamento é que facilita o teste de unidade dos objetos de sua aplicação. O Apêndice B mostra como tirar vantagem da injeção de dependência e de algumas classes orientadas a teste do Spring para testar suas aplicações.

Conteúdo adicional da web

Conforme escrevia esse livro, desejava abranger o máximo possível sobre o Spring. Deixei me levar e acabei escrevendo mais do que cabia no livro impresso. Assim como muitos fi lmes de Hollywood, muito material acaba indo para a sessão de cortes:

“Construção de aplicações portlet” - este capítulo abrange o framework Portlet MVC Spring. O Portlet MVC Spring é bastante similar ao MVC Spring (inclusive reutiliza algumas de suas classes), mas é instalado para circunstâncias especiais apresentadas pelos aplicativos portlet.

Apêndice C, “Referência de configuração de XML do Spring” – este apêndice documenta todos os elementos de confi guração XML disponíveis em Spring 2.0. Além disso, inclui o elemento de confi guração para Spring Web Flow e Direct Web Remoting (DWR).

Apêndice D, “Referência de biblioteca de tag JSP do Spring” – este apêndice documenta todas as tags JSP, tanto as tags JSP originais do Spring quanto as novas tags de associação a formulários do Spring 2.0.

Apêndice E, “Referência de definição Spring Web Flow” – este apêndice cataloga todos os elementos de XML que são utilizados para defi nir um fl uxo para Spring Web Flow.

Apêndice F, “Personalização de configuração do Spring” – este apêndice, que originalmente era parte do capítulo 3, mostra como criar namespaces personalizados de confi guração do XML do Spring.

Há algum bom material aí e não queríamos que o trabalho fosse por nada. Por isso ele está disponível para download de graça e em inglês. Você pode baixar este material extra on-line em: http://www.altabooks.com.br.

Quem deve ler este livro

O Spring em Ação – Segunda Edição foi feito para todos os desenvolvedores Java, mas os que estão no mundo corporativo vão considerá-lo particularmente útil. Embora o guiaremos suavemente através dos exemplos de código que desenvolvemos de forma complexa ao longo de cada capítulo, a verdadeira força do Spring consiste em sua capacidade de tornar mais fácil o desenvolvimento de aplicações corporativas. Por isso, os desenvolvedores corporativos apreciarão plenamente os exemplos apresentados neste livro.

Como uma vasta porção do Spring é devotada em fornecer serviços corporativos, muitos paralelos podem ser traçados entre este e o EJB. Dessa forma, qualquer experiência que você possua será útil ao fazer comparações entre esses dois frameworks.

Page 23: 00 Spring

xxiii

Finalmente, embora este livro não esteja exclusivamente focalizado em aplicativos web, uma boa parte dele é dedicada a este tópico. De fato, os quatro capítulos fi nais demonstram como o Spring pode dar suporte para o desenvolvimento da camada web de seus aplicativos. Se você for um desenvolvedor de aplicativos web, considerará especialmente valiosa a última parte deste livro.

Convenções de código

Há diversos exemplos de códigos neste livro. Esses exemplos aparecerão sempre numa fonte de código específi ca. Se houver uma parte do exemplo que desejamos que você preste atenção extra, ela aparecerá numa fonte de código com negrito. Todos os nomes de classe, nome de método ou fragmento de XML dentro do texto normal do texto aparecerá em fonte de código específi co também.

Muitas classes e pacotes do Spring têm nomes excepcionalmente longos (mas expressivos). Por causa disto, podem ser incluídos marcadores de continuação de linha ( ) quando necessário.

Nem todos os exemplos de código neste livro estão completos. Geralmente mostramos apenas um ou dois métodos de uma classe para focalizar um tópico em particular.

O código-fonte completo para a aplicação encontrado no livro pode ser baixado do web site da editora Altabooks em www.altabooks.com.br ou em www.manning.com/SpringinAction.

Sobre o autor

Craig Walls é um desenvolvedor profi ssional de software com mais de 13 anos de experiência e co-autor do XDoclet in Action (Manning, 2003). É um ávido defensor do Framework Spring, dando freqüentes palestras e conferências para grupos de usuários locais e escrevendo sobre Spring em seu blog. Quando não está criando código, Craig passa sempre que pode o tempo com sua esposa, duas fi lhas, seis pássaros, quatro cães, dois gatos e um número sempre fl utuante de peixes tropicais. Craig vive em Denton, Texas.

Author On-line

A aquisição do Spring em Ação inclui livre acesso a um fórum web privado (em inglês) mantido pela Manning Publications em que você pode fazer comentários sobre o livro, propor questões técnicas e receber ajuda dos autores e de outros usuários. Para acessar o fórum e inscrever-se entre em www.manning.com/ walls3 ou www.manning.com/SpringinAction. Esta página fornece as informações sobre como conseguir acessar o fórum, uma vez que você esteja registrado, que tipo de ajuda está disponível e as regras de conduta.

O compromisso da Manning com seus leitores é fornecer um foro em que um diálogo signifi cativo possa ter lugar entre leitores individuais e entre leitores e o autor. Não há um compromisso para qualquer quantidade específi ca de participações por parte do autor, cuja contribuição no fórum permanece voluntária (e não-remunerada). Sugerimos que você tente propor ao autor algumas questões desafi adoras para que o interesse dele não se disperse!

O fórum Author On-line e os arquivos dos debates anteriores estarão acessíveis no site da web da editora enquanto o livro (em inglês) estiver em circulação.

Page 24: 00 Spring

xxiv Spring em Ação

Sobre o título

Combinando apresentações, aspectos gerais e exemplos práticos, os livros da série Em Ação são projetados para ajudar no aprendizado e na recapitulação. De acordo com pesquisas em ciência cognitiva, as coisas das quais as pessoas se recordam são aquelas que descobriram durante exploração automotivada.

Embora ninguém na Manning seja um cientista cognitivo, estamos convencidos de que, para o aprendizado se tornar permanente, deve passar pelos estágios de exploração, execução e, de forma interessante, recapitulação do que está sendo aprendido. As pessoas compreendem e relembram coisas novas, o que quer dizer que as assimilaram somente após explorá-las ativamente. O homem aprende em ação. Parte essencial de um guia Em Ação é sua orientação através de exemplos. Isso incentiva o leitor a tentar algo além, a experimentar novos códigos e a explorar novas idéias.

Existe uma outra e mais trivial razão para o título deste livro: nossos leitores são pessoas ocupadas. Usam nossos livros para fazer uma tarefa ou resolver um problema. Precisam de livros que lhes permitam avançar e retroceder facilmente na leitura, e aprender apenas o que quiserem e quando quiserem. Precisam de livros que os auxiliem em ação. Os livros desta série são projetos para tais leitores.

Page 25: 00 Spring

xxv

Sobre a ilustração de capa

A fi gura na capa de Spring em Ação – Segunda Edição é um “Le Caraco,” ou um habitante da província de Karak no sudoeste da Jordânia. Sua capital é a cidade de Al-Karak, que ostenta um castelo antigo no topo de uma colina com uma visão magnífi ca do Mar Morto e das planícies que o cercam.

A ilustração foi retirada de um guia de viagem francês, Encyclopedie des Voyages, por J. G. St. Saveur, publicado em 1796. Viajar por prazer era um fenômeno relativamente novo naquele tempo, e guias de viagem como este eram populares, apresentando ao turista como também ao viajante de poltrona os habitantes de outras regiões da França e do exterior.

A diversidade dos desenhos na Encyclopedie des Voyages fala vividamente da singularidade e individualidade das cidades províncias do mundo e há apenas 200 anos. Era um tempo em que os códigos de vestimenta de duas regiões separadas por algumas milhas identifi cavam o povo como pertencente a uma ou a outra de modo único. O guia de viagem traz para a vida um sentido de isolamento e distância deste período e de cada período histórico, com exceção ao nosso próprio presente hipercinético.

Os códigos de vestuário mudaram desde então e a diversidade por região, tão rica naquele tempo, desvaneceu. Hoje em dia é difícil diferenciarmos entre os habitantes de diferentes continentes. Talvez, tentando ver de forma otimista, estejamos trocando uma diversidade visual e cultural por uma vida pessoal mais variada. Ou então por uma vida intelectual e técnica mais variada e interessante.

Nós da Manning celebramos a inventividade, a iniciativa e a diversão do negócio de computadores com capas de livros com base na rica diversidade da vida regional de séculos atrás, trazidas de volta à vida pelas ilustrações deste “guia de viagem”.

Page 26: 00 Spring

26 Spring em Ação

Parte 1

Elementos Essenciais do Spring

O Spring faz muitas coisas, mas quando você o separa em partes centrais, os recursos principais do Spring são injeção de dependência (DI) e programação orientada a aspecto (AOP). Iniciando no capítulo 1, “Como colocar Spring em ação,” você terá uma rápida visão geral de DI e AOP em Spring e verá como podem ajudá-lo a desacoplar objetos de aplicativo.

No capítulo 2, “Associação básica de bean”, daremos um olhar mais detalhado em como manter os objetos de seu aplicativo com baixo acoplamento usando DI. Você aprenderá como defi nir os objetos de seu aplicativo e como associá-los com dependências no container do Spring usando XML.

Revelando um furo no capítulo 3, “Associação avançada de bean”, exploraremos alguns dos recursos mais avançados do container e veremos como usar algumas das técnicas mais poderosas de confi guração do Spring.

O capítulo 4, “Como advertir beans,” explora como usar os recursos AOP do Spring para desacoplar serviços globais de sistema (como segurança e auditoria) a partir dos objetos aos quais servem. Este capítulo estabelece o estágio para os capítulos 6 e 7, em que você aprenderá como usar a AOP do Spring para fornecer transações declarativas e de segurança.

Page 27: 00 Spring

27CAPÍTULO 1Como colocar o Spring em ação

1Como colocar o Spring em ação

Este capítulo abrange:

Exploração dos módulos essenciais do Spring

Desacoplamento de objetos de aplicativo

Gerenciamento de propriedades transversais com programação orientada a aspecto (AOP)

Page 28: 00 Spring

28 Spring em Ação

Tudo começou com um bean.

Em 1996, a linguagem de programação Java ainda era uma plataforma jovem e empolgante. Muitos desenvolvedores migraram para a linguagem, porque descobriram como criar ricos e dinâmicos aplicativos da web usando applets. Logo aprenderam que havia mais nesta estranha e nova linguagem do que em personagens de desenhos animados. Diferentemente de qualquer linguagem anterior, o Java tornou possível escrever aplicativos completos, compostos por partes discretas. Eles vieram por causa dos applets, mas fi caram pelos componentes.

Foi em dezembro daquele ano que a Sun Microsystems publicou as especifi cações para JavaBeans 1.00-A. O JavaBeans defi nia um modelo de componente de software para Java. Esta especifi cação defi niu um conjunto de políticas de códigos que habilitavam simples objetos Java a serem reutilizados e facilmente compostos em aplicativos mais complexos. Embora o JavaBeans tivesse sido planejado com a intenção geral de defi nir componentes de aplicativos reutilizáveis, foi usado principalmente como um modelo na construção de widgets de inter faces de usuário. Parecia simples demais para ser capaz de qualquer trabalho “real”. Os desenvolvedores corporativos queriam mais.

Aplicativos sofi sticados com freqüência exigem serviços como suporte de transação, segurança e computação distribuída. Serviços não diretamente oferecidos pela especifi cação JavaBeans. Por essa razão, em março de 1998, a Sun publicou a versão 1.0 da especifi cação Enterprise JavaBeans (EJB). Esta ampliou a noção dos componentes Java para o lado do servidor, fornecendo importantes serviços corporativos, mas falhou ao não continuar com a simplicidade da especifi cação JavaBeans original. De fato, exceto pelo nome, o EJB apresenta pouquíssima semelhança com a especifi cação JavaBeans original.

Apesar do fato de que muitos aplicativos de sucesso foram desenvolvidos com base no EJB, este nunca alcançou seu propósito almejado: simplifi car o desenvolvimento de aplicativos corporativos. É verdade que o modelo de programação declarativa do EJB simplifi ca muitos aspectos infra-estruturais de desenvolvimento, como transações e segurança. Contudo, na direção oposta, os EJBs complicam o desenvolvimento ao designar descritores de implantação e códigos pesados (interfaces home e remote/local). Com o passar do tempo, muitos desenvolvedores fi caram desencantados com o EJB. Como resultado, sua popularidade começou a minguar nos últimos anos, deixando muitos desenvolvedores à procura de uma maneira mais fácil de programar.

Hoje em dia, o desenvolvimento de componentes em Java retornou às raízes. Novas técnicas de programação, incluindo a programação orientada a aspecto (AOP) e injeção de dependência (DI), dão ao JavaBeans muito do poder reservado anteriormente ao EJB. Estas técnicas fornecem aos POJOs (plain-old Java objects) um modelo de programação declarativa remanescente do EJB, mas sem a sua complexidade.

Já não é necessário recorrer a um componente EJB de difícil controle, quando um simples JavaBean basta.

Com toda a justiça, até os EJBs estão empenhados em promover um modelo de programação com base em POJO. Usando idéias como DI e AOP, a última especifi cação EJB é signifi cativamente mais simples que seus predecessores. Para muitos desenvolvedores, contudo, isto se move pouco e muito tarde. No tempo em que a especifi cação EJB 3 entrou em cena, outros frameworks com base em POJO já tinham se estabelecido de fato como padrões na comunidade Java.

Liderando a iniciativa de desenvolvimento leve baseado em POJOs está o Spring Framework, que estaremos explorando ao longo deste livro. Neste capítulo, exploraremos o Framework Spring num nível elevado, dando a você uma prova do que o Spring é capaz. Este capítulo dará uma boa idéia dos tipos de problemas que o Spring resolve e como estabelecerá o estágio para o restante do livro. Começando do começo — vamos descobrir o que é Spring.

Page 29: 00 Spring

29CAPÍTULO 1Como colocar o Spring em ação

1.1 O que é Spring?Spring é um framework de código aberto, criado por Rod Johnson e descrito em seu livro, Expert One-on-One: J2EE Design e Development. Foi criado para lidar com a complexidade de desenvolvimento de aplicativos corporativos. O Spring torna possível usar simples JavaBeans para conseguir coisas que antes só eram possíveis com EJBs. Porém, a utilidade do Spring não é limitada ao desenvolvimento do lado do servidor. Qualquer aplicativo em Java pode se benefi ciar do Spring em termos de simplicidade, testabilidade e baixo acoplamento.

OBSERVAÇÃO: Para evitar ambigüidade, será usado o termo “bean” quando se referir ao JavaBeans convencional e “EJB” quando for JavaBeans Enterprise. Eventualmente também será usado o termo “POJO” (plain-old Java object).

O Spring faz muitas coisas, mas quando as partes de sua base são dissecadas, é um leve framework e container orientado a aspecto, com injeção de dependência. Parece pouco, mas resume o objetivo central do Spring. Para isso fazer sentido, leia as descrições abaixo:

Container leve — O Spring é um framework leve, em termos de tamanho e sobrecarga. O Framework Spring inteiro pode ser distribuído em um único arquivo JAR com no máximo 2.5 MB. E a sobrecarga de processamento exigida pelo Spring é desprezível. Além disso, o Spring não é invasivo: os objetos de um aplicativo habilitados pelo Spring geralmente não têm nenhuma dependência com classes específi cas deste.

Injeção de Dependência — O Spring promove baixo acoplamento através de uma técnica conhecida como injeção de dependência (DI). Quando a DI for aplicada, os objetos são passivamente colocados em suas dependências, no lugar de criarem ou procurarem por objetos dependentes. É possível pensar em DI como JNDI às avessas — no lugar de um objeto pesquisar por dependências em um container, é este que dá as dependências ao objeto imediatamente, sem esperar ser requisitado.

Orientado a Aspecto — O Spring vem com um rico suporte para programação orientada a aspecto (AOP), que permite um desenvolvimento coeso, separando a lógica de negócio dos aplicativos, dos serviços de sistema (como auditoria e gerenciamento de transação). Objetos de aplicativo fazem o que têm de fazer — executar a lógica de negócios — e nada mais. Não são responsáveis por (ou até mesmo cientes de) outras preocupações do sistema, como realização de log ou suporte transacional.

Container — O Spring é um container no sentido em que contém e gerencia o ciclo de vida e a confi guração de objetos do aplicativo. Em Spring, é possível declarar como cada objeto de suas aplicações deve ser criado, confi gurado e associado entre si.

Framework — O Spring torna possível confi gurar e compor aplicativos complexos a partir de componentes mais simples. No Spring, os objetos de aplicativo são compostos de modo declarativo, geralmente em um arquivo XML. O Spring também fornece muita funcionalidade de infra-estrutura (gerenciamento de transação, integração de framework de persistência, etc), deixando o desenvolvimento da lógica de aplicação para você.

Recapitulando: Quando as partes da base do Spring são dissecadas, o que se obtém é um framework que ajuda no desenvolvimento de código de aplicativo com baixo acoplamento. Mesmo se isso fosse tudo o que pudesse fazer, os benefícios de baixo acoplamento (manutenibilidade e testabilidade) fazem do Spring um framework que vale a pena para desenvolver aplicativos.

Mas ele é mais do que isso. O Framework Spring vem com uma série de módulos construídos a partir da base de injeção de dependência e AOP, e cria uma plataforma cheia de recursos, sobre a qual se constroem os aplicativos.

Page 30: 00 Spring

30 Spring em Ação

1.1.1 Módulos do Spring

O Framework Spring é composto de vários módulos bem defi nidos (veja a fi gura 1.1). Ao serem tomados como um todo, estes módulos fornecem tudo o que é necessário para desenvolver aplicativos para soluções corporativas (enterprise-ready). Mas não é necessário ter o Framework Spring como base para seus aplicativos. Você é livre para escolher os módulos que se adaptem aos seus aplicativos e buscar por outras opções quando o Spring não for apropriado. De fato, o Spring oferece pontos de integração com diversos outros frameworks e bibliotecas, de maneira que não tenha que desenvolvê-los por si próprio.

AOP

ORM

DAO

JMX JCA JMS

Web

MVC Portlet

Remotabilidade

Contexto

MVC

Núcleo

Figura 1.1 O Framework Spring é composto de vários módulos bem defi nidos construídos em cima do container base. Esta modularidade torna possível usar mais ou menos do Framework Spring conforme o necessário num aplicativo particular.

Como se pode observar, todos os módulos do Spring são construídos em cima do container base. O container defi ne como os beans são criados, confi gurados e gerenciados — entre algumas das loucuras do Spring. É possível usar estas classes implicitamente ao confi gurar seu aplicativo. Mas como desenvolvedor, provavelmente você está interessado nos outros módulos que alavancam os serviços fornecidos pelo container. Estes módulos fornecem os frameworks com os quais você desenvolve seus serviços de aplicativo, como AOP e persistência.

Vamos dar uma olhada em cada módulo na fi gura 1.1, um de cada vez, para ver como se ajustam no quadro geral do Spring.

O container base

Muito da base da fi gura 1.1, você encontrará no container base do Spring. Este fornece a funcionalidade fundamental do Framework Spring. Este módulo contém o BeanFactory, que é o container fundamental do Spring e a base na qual a DI se fundamenta.

Discutiremos o módulo base (o centro de qualquer aplicativo Spring) ao longo deste livro, iniciando no capítulo 2, quando examinaremos a associação de beans usando DI.

Módulo de contexto de aplicativo

O contexto de aplicativo do Spring é desenvolvido sobre o container base. O BeanFactory do módulo base faz do Spring um container, mas o módulo de contexto é o que o torna um

Page 31: 00 Spring

31CAPÍTULO 1Como colocar o Spring em ação

framework. Este módulo estende o conceito do BeanFactory, acrescentando suporte para mensagens internacionalizadas (I18N), eventos de ciclo de vida e validação. Além do mais, este módulo fornece muitos serviços corporativos como e-mail, acesso a JNDI, integração com EJB, remotabilidade, e agendamento. Também está incluído suporte para integração com frameworks de modelagem, como Velocity e FreeMarker.

Módulo AOP do Spring

O Spring fornece rico suporte para programação orientada a aspecto em seu módulo AOP. Este módulo serve como base para o desenvolvimento dos seus próprios aspectos para seus aplicativos habilitados por Spring. Como a DI, a AOP tem suporte para baixo acoplamento de objetos de aplicativo. Com a AOP, porém, requisitos específi cos de aplicação (como transações e segurança) são desacoplados dos objetos nos quais estão aplicados.

O módulo AOP do Spring oferece diversas abordagens para o desenvolvimento de aspectos, incluindo os com base nas interfaces AOP Alliance (http://aopalliance.sf.net) e suporte para AspectJ. Faremos um aprofundamento em suporte AOP do Spring no capítulo 4.

A abstração do JDBC e o módulo DAO

Trabalhar com JDBC freqüentemente resulta numa grande quantidade de código repetitivo que obtém uma conexão, cria uma declaração, processa um conjunto de resultados e fecha a conexão. O módulo JDBC e Data Access Objects (DAO) do Spring abstrai o código repetitivo de maneira que você possa manter seu código do banco de dados limpo e simples, além de prevenir problemas que resultam da falha em fechar os recursos do bancos de dados. Este módulo também constroem uma camada de exceções signifi cativas em cima das mensagens de erro dadas por vários servidores de banco de dados. Tentar decifrar mensagens de erro crípticas ou de SQL proprietário: nunca mais!

Além disso, este módulo utiliza outro, o de AOP do Spring, para fornecer serviços de gerenciamento de transações para objetos num aplicativo Spring.

Veremos como a abstração de JDBC com base em modelo pode simplifi car muito o código JDBC quando examinarmos o acesso a dados do Spring no capítulo 5.

Módulo de integração de mapeamento objeto/relacional (ORM)

Para aqueles que preferem usar uma ferramenta de mapeamento objeto/relacional (ORM) diretamente sobre o JDBC, o Spring fornece o módulo ORM. O suporte do ORM do Spring é construído sobre o suporte de DAO, fornecendo um modo conveniente para desenvolver DAOs a várias soluções ORM. O Spring não tenta implementar sua própria solução ORM, mas fornece integrações para diversos frameworks populares de ORM, incluindo Hibernate, Java Persistence API, Java Data Objects e Mapeamentos SQL iBATIS. O gerenciamento transacional do Spring dá suporte para cada um destes frameworks, bem como para JDBC.

Além da abstração JDBC com base em modelo do Spring, veremos como o Spring fornece uma abstração similar para frameworks ORM e de persistência no capítulo 5.

Java Management Extensions (JMX)

Expor os trabalhos internos de um aplicativo Java para gerenciamento é a parte crítica de pegar uma produção de aplicativo pronta. O módulo JMX do Spring facilita a exposição de seus beans de aplicativo como JMX MBeans. Isso torna possível o monitoramento e a reconfi guração de um aplicativo em execução.

Daremos uma olhada no suporte do Spring para JMX no capítulo 12.

Page 32: 00 Spring

32 Spring em Ação

Java EE Connector API (JCA)

O cenário do aplicativo corporativo é cheio de mistura de aplicativos em execução sobre uma variedade de servidores e plataformas distintos. Integrar estes aplicativos pode ser complicado. A Java EE Connection API (mais conhecido como JCA) fornece um modo padronizado de integrar os aplicativos Java com uma variedade de sistemas de informação corporativos, incluindo mainframes e banco de dados.

De várias maneiras, o JCA é muito parecido com JDBC, com exceção de que enquanto o JDBC tem o foco no acesso ao banco de dados, a JCA é uma API com propósitos mais gerais de conexão a sistemas legados. O suporte Spring para JCA é similar ao do JDBC, abstraindo código repetitivo do JCA nos modelos.

O framework MVC de Spring

O paradigma Modelo/Visão/Controlador (MVC) é uma abordagem geralmente aceita para construir aplicativos web tais que a interface de usuário é separada da lógica de aplicação. O Java não tem escassez de frameworks MVC, com Apache Struts, JSF, WebWork e Tapestry entre as opções mais populares.

Embora o Spring possa ser integrado com vários frameworks MVC populares, vem com seu excelente framework que promove técnicas de baixo acoplamento na camada da web de um aplicativo.

Faremos um aprofundamento em MVC do Spring nos capítulos 13 e 14.

MVC Portlet do Spring

Muitos dos aplicativos web possuem base em página — isto é, cada solicitação resulta uma página completamente nova sendo apresentada.. Cada página normalmente apresenta uma parte específi ca das informações ou solicita ao usuário com um formulário específi co. Em contraste, aplicativos com base em portlet agregam diversas funcionalidades em uma única página da web. Isto fornece uma visão em vários aplicativos de uma vez.

Se você estiver desenvolvendo aplicativos habilitados por portlet, certamente desejará ver o framework MVC Portlet do Spring. O MVC Portlet do Spring é construído sobre o MVC do Spring para fornecer um conjunto de controladores que possuam suporte para API portlet de Java.

O módulo web do Spring

O MVC do Spring e o MVC Portlet do Spring exigem uma consideração especial ao carregarem o contexto do aplicativo do Spring. Dessa forma, o módulo web do Spring fornece classes de suporte especial para MVC do Spring e MVC Portlet do Spring.

O módulo web também contém suporte para diversas tarefas orientadas a web, como upload de arquivos e associação programática de parâmetros de requisição para seus objetos de negócio. Também contém suporte de integração com o Apache Struts e o JavaServer Faces (JSF).

Remotabilidade

Nem todos os aplicativos trabalham sozinhos. Às vezes, é necessário que um aplicativo alavanque a funcionalidade de outro aplicativo para conseguir fazer seu trabalho. Quando outro aplicativo é acessado através da rede, alguma forma de remotabilidade é utilizada para a comunicação.

O suporte para remoting do Spring permite que você exponha a funcionalidade de seus objetos Java como objetos remotos. Ou se for necessário acessar os objetos remotamente, o módulo

Page 33: 00 Spring

33CAPÍTULO 1Como colocar o Spring em ação

remoting também facilita o trabalho de associação de objetos remotos em seus aplicativos como se fossem POJOs locais. Muitas opções de remoting estão disponíveis, incluindo o Remote Method Invocation (RMI), Hessian, Burlap, JAX-RPC e próprio invocador HTTP do Spring.

No capítulo 8, exploraremos as diversas opções de remoting com suporte em Spring.

Java Message Service (JMS)

A desvantagem do remoting é que o mesmo depende da confi abilidade da rede e que as extremidades da comunicação estejam disponíveis. A comunicação orientada a mensagem, por outro lado, é mais confi ável e garante a entrega das mensagens, mesmo se a rede e os pontos fi nais não sejam confi áveis.

O módulo Java Message Service (JMS) do Spring ajuda a enviar mensagens para fi las e tópicos de mensagens JMS. Ao mesmo tempo, este módulo também auxilia na criação de POJOS dirigidos a mensagem que são capazes de consumir mensagens não-sincronizadas. Veremos como usar Spring para enviar mensagens no capítulo 10.

Embora o Spring cubra um bocado de chão, é importante observar que o mesmo evita a reinvenção da roda sempre que possível. O Spring baseia-se fortemente em APIs e frameworks existentes. Por exemplo, como veremos no capítulo 5, o Spring não implementa seu próprio framework de persistência — em vez disso, estimula a integração com vários frameworks de persistência capazes, incluindo o simples JDBC, iBATIS, Hibernate e JPA.

Agora que você visualizou o panorama geral, vamos ver como os recursos da DI e da AOP do Spring funcionam. Vamos fazer nossa primeira experiência associando nosso primeiro bean num container do Spring.

1.2 O início com SpringA injeção de dependência é a coisa mais básica que o Spring faz. Mas com o que a DI se parece? Na grande tradição de livros de programação, iniciaremos mostrando-lhe como o Spring trabalha com o exemplo “Hello World”. Ao contrário do programa original Hello World, este exemplo será um pouco diferente para demonstrar as noções básicas do Spring.

A primeira classe que o exemplo Hello World “Springifi cado” precisa é uma classe de serviço, cujo propósito é imprimir a nossa familiar saudação. A listagem 1.1 mostra a interface GreetingService, que defi ne o contrato para a classe de serviço.

Listagem 1.1 A interface para um serviço de saudação

package com.springinaction.chapter01.hello;public interface GreetingService {

void sayGreeting();}

GreetingServiceImpl (listagem 1.2) implementa a interface GreetingService. Embora não seja necessário esconder a implementação atrás de uma interface, é altamente recomen-dado como uma maneira de separar a implementação do seu contrato.

Listagem 1.2 GreetingServiceImpl, que imprime uma saudação agradável

package com.springinaction.chapter01.hello;public class GreetingServiceImpl implements GreetingService {

private String greeting;public GreetingServiceImpl() {}public GreetingServiceImpl(String greeting) {