Você está na página 1de 33

Recomendaes para a Primeira Edio

O Spring emAo umdestes raros livros que interligamummanual sobre o uso de determinado software com mlti plas idias sobre bons designs de programa e padres. Realmente gostei deste livro... Computing Reviews Cobre todas as bases com inmeros exemplos e instrues explcitas... um manual de referncias e instrues muito bem organizado e escrito de maneira fluente. Internet Bookwatch ... fcil de ler... e com um bocado de humor para ajudar... Books-On-Line Ainda que a documentao de referncia de Spring seja de excelente qualidade, este livro torna a aprendizagem muito mais agradvel, pois injeta a quantidade exata de humor que proporciona entretenimento. Se quiser aprender Spring,este o caminho. Bill Siggelkows Weblog Autor de Jakarta Struts Cookbook Uma grande fonte de pesquisa confivel... O livro define de maneira clara o poder que o Spring proporciona aos desenvolvedores e como esse abstrai muito dos servios J2EE mais pesados que a maioria das aplicaes srias usa. Esse livro foi desenvolvido atravs de um rigoroso programa de acesso prvio, por isso erros de cdigo e de gramtica felizmente no existem. Para mim,no h nada pior do que tentar aprender uma nova tecnologia a partir de um texto mal-escrito ou de um livro tcnico maleditado. Felizmente Craig,Ryan e equi pe da Manning tiveram o cuidado nos detalhes e produziram um livro que recomendo muito. JavaLobby.org Um manual de referncia completo que aborda quase todos os aspectos de Spring. E sem complicaes: cada explicao clara e h vrios exemplos de cdigo. ...Explica de maneira fcil o que Injeo de Dependncia e AOP significam, bem como Spring os torna possveis. ...como possvel escrever servios e Daos,alm de implementar de maneira simples gerenciamento de transao e remotabilidade de servios. ...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

ii

Spring em Ao

Spring em Ao
Segunda Edio
CRAIG WALLS e Ryan Breidenbach

Rio de Janeiro 2008


iii

iv

Spring em Ao

Spring Em Ao
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 autorizao prvia por escrito da editora, poder ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrnico, mecnico, fotogrco, gravao ou quaisquer outros. Todo o esforo foi feito para fornecer a mais completa e adequada informao, contudo a editora e o(s) autor(es) no assumem responsabilidade pelos resultados e usos da informao fornecida. Recomendamos aos leitores testar a informao, bem como tomar todos os cuidados necessrios (como o backup), antes da efetiva utilizao. Este livro no contm CD-ROM, disquete ou qualquer outra mdia. Erratas e atualizaes: Sempre nos esforamos para entregar a voc, leitor, um livro livre de erros tcnicos ou de contedo; porm, nem sempre isso conseguido, seja por motivo de alterao de software, interpretao ou mesmo quando alguns deslizes constam na verso original de alguns livros que traduzimos. Sendo assim, criamos em nosso site, www.altabooks.com.br, a seo Erratas, onde relataremos, com a devida correo, qualquer erro encontrado em nossos livros. Avisos e Renncia de Direitos: Este livro vendido como est, sem garantia de qualquer tipo, seja expressa ou implcita. Marcas Registradas: Todos os termos mencionados e reconhecidos como Marca Registrada e/ou comercial so de responsabilidade de seus proprietrios. A Editora informa no 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, no visando ao lucro, favorecimento ou desmerecimento do produto/fabricante. Produo Editorial: Editora Alta Books Coordenao Editorial: Thalita Arago Ramalho Traduo: Pricila Reiz Franz e Leandro Chu Reviso: Michele Paiva Reviso Tcnica: Rodrigo Amorim Diagramao: Patricia Ishiara Impresso no Brasil O cdigo de propriedade intelectual de 1 de Julho de 1992 probe expressamente o uso coletivo sem autorizao dos detentores do direito autoral da obra, bem como a cpia ilegal do original. Esta prtica generalizada nos estabelecimentos de ensino, provoca uma brutal baixa nas vendas dos livros a ponto de impossibilitar os autores de criarem novas obras.

Rua Viva Cludio, 291 Jacar Rio de Janeiro RJ. CEP: 20970-031 Tel: 21 3278-8069/ Fax: 3277-1253 www.altabooks.com.br e-mail: altabooks@altabooks.com.br

Para minha esposa Raymie e minhas filhas,Maisy e Madison Eu estou eternamente maravilhado por merecer o amor das trs mais belas garotas do mundo.

vi

Spring em Ao

contedo resumido
Parte 1 Elementos Essenciais do Spring.........................................1 1 2 3 4 Parte 2 Como colocar Spring em ao Associao bsica de bean 25 57 3

Associao avanada de bean Como advertir beans 91

Spring na camada de negcios .............................................121 5 6 7 8 Como acessar o banco de dados Como gerenciar transaes 175 197 243 123

Como assegurar aplicaes Spring

Spring e servios remotos com base em POJO

9 Como desenvolver servios web com contrato pr-denido (contract-rst) em Spring 275 10 11 12 Part 3 Como transmitir mensagens Spring Spring e Enterprise JavaBeans 337 351 307

Como acessar servios corporativos

Spring no lado cliente ..................................................387 13 14 15 16 Como tratar requisies web 389 425

Como fazer a renderizao de views web Como utilizar o Spring Web Flow 463

Como trabalhar com outros frameworks web Como configurar o Spring 531 541

497

Apndice A Apndice B

Como realizar testes com (e sem) Spring

ndice remissivo 557

Sumrio
Prefcio xv Prefcio para a Primeira Edio xvii Agradecimentos xix Sobre este livro xx Sobre o ttulo xxiv Sobre a ilustrao de capa xxv

Parte 1

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

Como colocar Spring em ao 3

1.1 O que Spring? 5 Mdulos do Spring 6 1.2 O incio com Spring 9 12

1.3 Como entender a injeo de dependncia 11 Injetao de dependncias 11 Injeo de dependncias em ao Injeo de dependncia em aplicativos corporativos 17 1.4 Aplicao de programao orientada a aspecto Introduo a AOP 19 AOP em ao 21 1.5 Resumo 24 19

Associao bsica de bean 25


29

2.1 Como pr seus beans no container 26 Como trabalhar com um contexto de aplicao Introduo ao BeanFactory 27 A vida de um bean 30 2.2 Como criar beans 32 Como declarar um bean simples 33 Como injetar atravs de construtores 39 34

2.3 Como injetar em propriedades de bean 37 Como referenciar outros beans Como injetar valores simples 38 Associao de colees 41 Associao vazia (nul l) 46

2.4 Associao automtica 47 Os quatro ti pos de associao automtica 47 Como misturar associao automtica com explcita 50 Associar ou no de maneira automtica 51
vii

viii

Spring em Ao

2.5 Como controlar criao de bean 51 Como delimitar bean 51 Criao de beans a partir de mtodos de fbrica Como inicializar e destruir beans 54 2.6 Resumo 56

53

Associao avanada de bean 57


60

3.1 Como declarar beans de pai e lho 58 Como extrair um ti po de bean bsico 58 Como extrair propriedades comuns 3.2 Como aplicar injeo de mtodos 62 Substituio bsica de mtodo 63 Como utilizar injeo getter 3.3 Como injetar beans que no so Spring 67 69 66

3.4 Como registrar editores personalizados de propriedade

3.5 Como trabalhar com beans especiais do Spring 72 Ps-processamento da fbrica de bean 75 Ps-processamento de beans 73 Externalizao de propriedades de configurao 75 Como resolver mensagens de texto 77 Como desacoplar com eventos de aplicao 79 Como criar beans conscientes (beans aware) 81 3.6 Como fazer script de beans 83 Como colocar o limo na cai pirinha 84 Como fazer scri pt de um bean 85 Injeo de propriedades de beans com scri pt 87 Atualizao de beans com scri pt Como escrever beans com scri pt in-line 88 3.7 Resumo 89

88

4
4.1

Como advertir beans 91


Introduo a AOP 93 Como definir a terminologia da AOP 93 Suporte para AOP do Spring 104 96

4.2 Como criar aspectos clssicos do Spring 98 Como criar advice 100 Como definir pointcuts e advisors Utilizao de ProxyFactoryBean 106 4.3 Autoproxying 109 Como criar autoproxies para aspectos do Spring Autoproxying de aspectos @AspectJ 110 113 110

4.4 Declarao de aspectos POJO puros 4.5 Como injetar aspectos AspectJ 4.6 Resumo 119 117

Parte 2 Spring na camada de negcios ...............................................121

Como acessar o banco de dados 123

5.1 Como aprender a losoa do acesso a dados do Spring 124 Como entender uma hierarquia de exceo do acesso a dados do Spring 126 Como padronizar o acesso a dados 128 Utilizao de classes de suporte a DAO 130 5.2 Como congurar uma fonte de dados 131 Utilizao de fontes de dados JNDI 132 Utilizao de uma fonte de dados em pool 133 Fonte de dados com base em driver JDBC 134 5.3 Utilizao de JDBC com Spring 135 O problema com o cdigo JDBC 135 Como trabalhar com modelos JDBC Como usar classes de suporte a DAO do Spring para JDBC 143 5.4 Como integrar Hibernate com Spring 145 Como escolher uma verso de Hibernate 147 Como utilizar modelos de Hibernate 147 Como desenvolver DAOs com base em Hibernate 151 Como usar sesses contextuais de Hibernate 3 152 5.5 Spring e Java Persistence API 154 Como usar modelos JPA 154 Como configurar uma fbrica de gerenciador de entidade 156 Como desenvolver um DAO com base em JPA 160 5.6 Spring e iBATIS 161 Como configurar um modelo de cliente iBATIS 161 Como desenvolver DAO com base em iBATIS 164 5.7 Realizao de cache 165 Como configurar uma soluo de realizao de cache 167 para cache 170 Cache dirigido a anotaes 172 5.8 Resumo 173 Como realizar proxy de beans 138

Como gerenciar transaes 175

6.1 Como entender as transaes 176 Como explicar transaes em apenas quatro palavras 177 Como entender o suporte de gerenciamento de transaes do Spring

178

6.2 Como escolher um gerenciador de transaes 179 Transaes JDBC 180 Transaes Hibernate 180 Transaes Java Persistence API 181 Transaes Java Data Objects Transaes API Java Transaction 182 6.3 Como programar transaes em Spring 6.4 Como declarar transaes 185
ix

182

182

Spring em Ao

Como definir atributos de transao 185 Como realizar proxy de transaes Como declarar transaes em Spring 2.0 192 Como definir transaes dirigidas a anotaes 194 6.5 Resumo 195

189

Como assegurar aplicaes Spring 197


198

7.1 Introduo a Spring Security

7.2 Como autenticar usurios 201 Como configurar um gerenciador de provedor 202 Como autenticar em um banco de dados 204 Como autenticar em um repositrio de LDAP 211 7.3 Como controlar o acesso 216 Como votar decises de acesso 216 Como tratar abstinncia de um votante Como escolher um voto de deciso de acesso 218 217

7.4 Como assegurar aplicaes web 219 Como fazer proxy dos filtros de Spring Security 222 Como tratar o contexto de segurana 227 Como solicitar ao usurio para realizar login 228 Como tratar excees de segurana 232 Como reforar a segurana na web 234 Como garantir um canal seguro 235 7.5 Segurana da camada de viso 237 Contedo renderizado condicionalmente 238 Como exibir informaes de autenticao de usurio 7.6 Como assegurar invocaes de mtodo 240 Como criar um aspecto de segurana 240 Como assegurar mtodos utilizando metadados 241 7.7 Resumo 242

239

Spring e servios remotos com base em POJO 243


244 249

8.1 Uma viso geral do remotabilidade do Spring 8.2 Como trabalhar com RMI 247 Como associar servios RMI 247

Como exportar servios RMI

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

254 258

8.4 Como utilizar HttpInvoker do Spring 257 Como acessar servios via HTTP 257 Como expor beans como servios HTTP

8.5 Spring e servios web 260 Como exportar beans como servios web usando XFire 260 Como declarar servios web com anotaes JSR-181 263 Como consumir servios web 266 Como realizar proxy de servios web com um cliente XFire 271 8.6 Resumo 272

Como desenvolver servios web com contrato pr-denido (contract-rst) em Spring 275
277

9.1 Introduo a Spring-WS

9.2 Denio do contrato (primeiro!) 278 Como criar mensagens XML de exemplo 279 9.3 Como tratar mensagens com endpoints de servio 283 Como desenvolver uma mensagem endpoint com base em JDOM 284 Como organizar carregamentos de mensagens 286 9.4 Associao de todos juntos 288 Spring-WS: Viso global 289 Como mapear mensagens para endpoints 290 Como realizar associaes com endpoint de servio 291 Como configurar um organizador de mensagem 291 Como tratar excees endpoint 293 Como servir arquivos WSDL 295 Como instalar o servio 298 9.5 Como consumir servios web Spring-WS 298 Como trabalhar com modelos de servios web 299 Utilizao de suporte a gateway do servio web 305 9.6 Resumo 306

10

Como transmitir mensagens Spring 307


311

10.1 Uma breve introduo a JMS 308 Como fazer arquitetura JMS 309 Avaliao dos benefcios de JMS Como configurar ActiveMQ em Spring 313

10.2 Como utilizar JMS com Spring 314 O problema com o cdigo JMS 314 Como trabalhar com modelos JMS 315 Como converter mensagens 321 Utilizao de classes de suporte a gateway do Spring por JMS 323 10.3 Como criar POJOs dirigidos a mensagem Criao de um listener de mensagem 326 Como escrever MDPs ti po POJO puro 328 325

10.4 Utilizao de RPC com base em mensagem 331 Introduo a Lingo 332 Exportao do servio 333 Como realizar proxy de JMS 334 10.5 Resumo 336

11

Spring e Enterprise JavaBeans 337


339

11.1 Como acessar EJBs no Spring 338 Como fazer proxy em beans de seo (EJB 2.x)
xi

xii

Spring em Ao

Como conectar EJBs aos beans do Spring

343 343

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

11.3 Spring e EJB 3 346 Introduo ao Pitchfork 346 Pitchfork 347 Como injetar recursos via anotao 348 Como declarar interceptores atravs de anotaes 349 11.4 Resumo 350

12

Como acessar servios corporativos 351


Como injetar objetos JNDI 355

12.1 Como associar objetos do JNDI 352 Como trabalhar com o JNDI convencional 353 Como associar objetos JNDI no Spring 2 357 12.2 Como enviar e-mails 358 Como configurar um emissor de e-mail 358

Como criar o e-mail

360 365

12.3 Como agendar tarefas 363 Como agendar com o Timer do Java 363 Como utilizar o Quartz scheduler Como chamar mtodos em um agendamento 369 12.4 Como gerenciar beans com o JMX 371 Como exportar beans do Spring como MBeans 372 Como tratar notificaes 383 12.5 Resumo Parte 3 386 Acesso remoto a MBeans

380

Spring no lado cliente........................................................387

13

Como tratar requisies web 389


392

13.1 Introduo ao MVC do Spring 390 Um dia na vida de uma requisio 390 Como configurar o DispatcherServlet Guia essencial do MVC do Spring 394

13.2 Como mapear requisies para controllers 399 Como utilizar o Como utilizar o SimpleUrlHandlerMapping 400 Control lerClassNameHandlerMapping 401 Como utilizar metadados para mapear controladores 401 Como trabalhar com vrios mapeamentos de controladores 402 13.3 Como gerenciar requisies com os controllers 403 Como processar comandos 405 Como processar submisses de formulrios Como processar formulrios complexos com assistentes 414 Como trabalhar com control lers throwaway 420 13.4 Tratamento de excees 13.5 Resumo 423 422 407

14

Como fazer a renderizao de views web 425


429

14.1 Como determinar as views 426 Como utilizar views template 427 Como determinar beans view Como escolher um determinador de view 431 14.2 Como utilizar templates JSP 432 Como fazer a associao dos dados do formulrio 432 Como exibir mensagens externalizadas 434 Como exibir erros 14.3 Como modelar o layout das pginas com Tiles 438 Views Tile 438 Como criar control lers de Tile 441

436

14.4 Como trabalhar com alternativas JSP 443 Como utilizar templates Velocity 443 Como trabalhar com o FreeMarker 14.5 Como gerar sada no-HTML 453 Como gerar documentos PDF Como criar planilhas do Excel 453 Como desenvolver visualizaes personalizadas 458 14.6 Resumo 460 456

449

15

Como utilizar o Spring Web Flow 463


469

15.1 Introduo ao Spring Web Flow 465 Como instalar o Spring Web Flow 466 Princpios bsicos do Spring Web Flow Como criar um fluxo 471 15.2 Como construir a base do uxo 471 Variveis de fluxo 472 Estados de incio e de fim 473 Como coletar as informaes do cliente 474 Como criar um pedido de pizza Como finalizar o pedido 482 Alguns toques finais 484 15.3 Tcnicas avanadas de uxos para a web 487 Como utilizar os estados de deciso 488 Como extrair subfluxos e utilizar sub-estados 489 15.4 Como integrar o Spring Web Flow a outros frameworks Jakarta Struts 493 JavaServer Faces 494 15.5 Resumo 495 493

479

16

Como trabalhar com outros frameworks web 497


Como declarar actions do Struts 502 E o Struts 2? 504 505

16.1 Como usar o Spring com o Struts 498 Como registrar o plug-in do Spring com o Struts 500 que enxerguem o Spring 500 Como delegar actions 16.2 Como integrar o Spring ao WebWork 2/Struts 2
xiii

xiv

Spring em Ao

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

Como integrar o Spring ao Tapestry 4

16.4 Como integrar o Spring ao JSF 512 Como configurar os beans Como configurar as propriedades controladas pelo JSF 513 do Spring 515 Como usar os beans do Spring em pginas JSF 515 Como exportar o contexto do aplicativo no JSF 516 16.5 Aplicativos habilitados Ajax no Spring com o DWR 517 Acesso remoto direto pela web 518 Como acessar beans do DWR controlados pelo Spring 525 16.6 Resumo 529 531 541

Apndice A: Como congurar o Spring

Apndice B: Como realizar testes com (e sem) o Spring ndice remissivo 563

Contedo da web (Os tpicos seguir esto disponveis em ingls no site: www.altabooks.com) Captulo da web Construo de aplicaes portlet Apndice C Apndice D Apndice E Apndice F Referncia de congurao de XML do Spring Referncia de biblioteca de tag JSP do Spring Referncia de denio Spring Web Flow Personalizao de congurao do Spring

Prefcio
Eu estava ao lado de um centro de convenes de um amplo hotel, em Miami Beach, Flrida, 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 Flrida com um nico propsito: 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, espervamos as palavras do criador do Spring, Rod Johnson, que apresentou a palestra de abertura da conferncia. 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 prxima verso. No havia avanado muito na apresentao quando Rod pediu que todos prestassem muita ateno. Todos camos na expectativa de excelentes novas funcionalidades a serem disponibilizadas no Spring 1.3, a suposta nova verso. Para nossa grande surpresa, Rod nos disse que no haveria Spring 1.3; a prxima verso seria Spring 2.0. A deciso de aumentar o nmero principal da verso do prximo lanamento no tomada de forma leviana. Tal ao denota um avano signicativo em Spring. Se a prxima verso seria 2.0, ento podamos esperar melhorias principais. De fato, dez meses mais tarde, o Spring 2.0 foi lanado com uma abundncia de novas habilidades, incluindo: Congurao de XML simplicada e a opo de criar elementos personalizados de congurao AOP e transaes muito simplicadas Suporte para anotaes Java 5 para declarar aspectos, transaes 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 parmetros nomeados e recursos Java 5 Suporte aprimorado para JMS, incluindo recebimento de mensagens de maneira no-sincronizada (para a criao de POJOs dirigidos a mensagens) Uma nova biblioteca de tags JSP para binding de formulrios Diversas melhorias em congurao sobre conveno para reduzir a quantidade de XML exigido para congurar Spring Suporte para Java Persistence API (JPA) Denio aprimorada de bean, incluindo delimitao de pedido e seo de beans para aplicaes da web A habilidade para executar injeo de dependncia sobre objetos que o Spring no cria (como objetos de domnio) Em certo ponto de sua apresentao, Rod disse que se a profuso de novos recursos a serem introduzidos no justicava o salto para 2.0, como poderiam estar aptos para justicar o lanamento 2.0?
xv

xvi

Spring em Ao

Isto no era tudo. Alm do trabalho feito no ncleo de Framework Spring, vrios projetos interessantes relacionados com o Spring estavam por trs para fornecer habilidades adicionais. Entre elas: Spring Web Flow, que tem base no Spring MVC e permite o desenvolvimento de aplicaes da web com base em uxos XFire, para exportar seus beans do Spring como servios da web SOAP Spring-WS para criar servios da web com contratos pr-denidos Spring Modules, que fornece (entre outras coisas) realizao de cache declarativo e validao Direct Web Remoting (DWR) para beans do Spring habilitados por Ajax Lingo, que torna possvel invocar de maneira no-sincronizada mtodos sobre bean remotos Ento tive a seguinte idia: se todos esses novos avanos no justicavam uma segunda edio do Spring em Ao, o que justicaria? Descobri que a Manning estava pensando a mesma coisa. E agora, depois de um ano, aqui est a to esperada atualizao do Spring emAo, 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 edio o mesmo da primeira: compartilhar a alegria de desenvolver em Spring. Espero que este livro sirva para reforar seu prazer em Spring.

Prefcio para a primeira edio


Os desenvolvedores de software precisam ter diversas caractersticas de maneira a fazer bem o seu trabalho. Em primeiro lugar, devem ser bons pensadores analticos 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 solues criativas e bem-sucedidas. Tambm precisam ser curiosos. Os desenvolvimentos na indstria de software so alvos mveis, que esto sempre em evoluo. Novos frameworks, tcnicas, linguagens e metodologias emergem constantemente. Cada qual um nova ferramenta que precisa ser dominada e includa na caixa de ferramentas, permitindo ao desenvolvedor realizar melhor e de maneira mais rpida o seu trabalho. Em seguida h a caracterstica mais apreciada de todas a preguia. O tipo de preguia que motiva desenvolvedores a trabalharem arduamente para encontrar solues com a menor quantidade de esforo. Foi com curiosidade, uma boa dose de preguia e todas as capacidades analticas que pudemos conseguir reunir, que dois de ns pesquisaram juntos por quatro anos para encontrar novas maneiras de desenvolver software. Foi a poca em que o software de cdigo aberto estava alcanando uma massiva crtica na comunidade Java. Toneladas de frameworks de cdigo aberto estavam orescendo no cenrio Java. Para decidir qual adotar, era preciso que atingisse o ponto exato de nossas necessidades tinha de fazer 80% do que precisvamos imediatamente. E para qualquer funcionalidade que no fosse imediata, o framework precisava ser facilmente extensvel de maneira que essa pudesse ser includa. Estender no signicava colocar um remendo que fosse to feio a ponto de voc depois se sentir sujo signicava estender em um estilo elegante. Isso no era pedir muito, certo? O primeiro destes frameworks que ganhou adoo imediata de nossa equipe foi o Ant. Desde o princpio, podamos dizer que o Ant fora criado por outro desenvolvedor que conhecia nosso sofrimento em construir aplicaes Java. A partir daquele momento, nunca mais javac. Nunca mais CLASSPATH. Tudo isto com uma congurao XML direta (embora, s vezes, prolixa). Iupi! A vida (e a compilao) tornou-se muito mais fcil. Conforme prosseguamos, comeamos a adotar mais e mais ferramentas. O Eclipse tornouse a nossa opo de IDE. Log4J transformou-se nosso (e de outros mais) kit de ferramentas padro de realizao de logon. E Lucene suplantou nossa soluo de pesquisa comercial. Cada uma dessas ferramentas correspondia aos nossos critrios de preenchimento de uma necessidade, ao mesmo tempo em que era fcil 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 especca da aplicao, como a pesquisa, no caso de Lucene, e de realizao de logon, em Log4J. Nenhuma delas destinava-se s necessidades no corao das aplicaes empresariais: persistncia, transaes e integrao com outros recursos da empresa.

xvii

xviii

Spring em Ao

Tudo isso mudou l pelo ano passado, quando descobrimos o notvel potencial corporativo de Spring e Hibernate. Entre esses dois frameworks, quase todas as nossas necessidades de camadas intermedirias 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 cdigo parecesse bom. Com a injeo de dependncia do Spring conseguimos nos livrar de todos os nossos fabricantes e configuradores personalizados. De fato, esta foi a razo pela qual integramos em primeiro lugar o Spring em nossas aplicaes. Sua conexo permitiu-nos modernizar a congurao de nossas aplicaes e abandonar as solues domsticas. (Hei, todo o desenvolvedor gosta de escrever seu prprio framework. Mas algumas vezes voc precisa simplesmente renunciar a isto!) Rapidamente descobrimos um excelente bnus: o Spring tambm fornecia integrao bastante fcil com o Hibernate. Isto nos permitiu descartar nossas classes de integrao personalizadas do Hibernate e usar o suporte do Spring em seu lugar. Por sua vez, conduziunos diretamente ao suporte do Spring para persistncia transparente. Observe atentamente e voc ver um padro aqui. Quanto mais usvamos Spring, mais descobramos novos recursos. E cada recurso descoberto era um prazer de se trabalhar. Seu framework MVC web funcionava perfeitamente com algumas aplicaes. Seu suporte para AOP foi til em diversos lugares, principalmente na segurana. O suporte a JDBC foi bastante apropriado para alguns programas menores. Ah, claro, tambm o usamos para o planejamento. E acesso a JNDI. E integrao de e-mail. Quando isto atinge os pontos principais do desenvolvimento, o Spring ganha de goleada. Gostamos tanto do Spring que decidimos que algum deveria escrever um livro sobre ele. Felizmente, um de ns j havia escrito um livro para a Manning e sabia como ir adiante neste tipo de coisa. Logo aquela expresso algum deveria escrever um livro tornou-se ns. Ao assumir este projeto, tentamos divulgar a palavra divina do Spring. O framework Spring trouxe-nos somente satisfao ao trabalhar com ele prevemos que o mesmo ocorrer com voc. E esperamos que este livro seja um agradvel veculo para voc atingir esse ponto.

Agradecimentos
Uau! Levou muito mais tempo para fazer este livro do que pensei que levaria. Mas no havia outra maneira de voc estar com esse exemplar nas mos se no fosse a ajuda, inspirao e estmulo de todo o pessoal por trs dos panos. Em primeiro lugar, gostaria de agradecer s almas trabalhadoras da Manning que milagrosamente transformaram o meu manuscrito escrito de maneira negligente na na pea de literatura de programao 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. Tambm gostaria de agradecer aos revisores que dependeram tempo para fornecer o feedback e a crtica necessria 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. Alm disso, Erik Weibust e Valentin Crettaz zeram uma segunda reviso tcnica do manuscrito, um pouco antes de ser publicado. E h aquelas pessoas que no 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 pacincia em outro projeto de livro que parecia no ter mais m. Desculpe se demorou tanto. Agora que acabou, prometo-lhe mais ores e encontros. E quem sabe algum trabalho no jardim. s minhas doces e adorveis garotinhas, Maisy e Madison: Obrigado pelos abraos, risadas e intervalos que me proporcionaram uma pausa agradvel do livro. A Ryan Breidenbach, meu co-autor na primeira edio: Muito obrigado por me ajudar no incio e pelo seu feedback na segunda edio. equipe do Spring: Nenhuma parte desse livro seria possvel (ou mesmo necessria) sem a viso de vocs e a determinao em criar um framework to impressionante. Gostaria de agradecer especialmente a Rod Johnson e Colin Sampaleanu por seus comentrios no meu blog e nas sees IM que ajudaram a guiar meu pensamento, assim como Arjen Poutsma pela reviso do captulo sobre Spring-WS. A todos os meus colegas de trabalho durante os ltimos anos: aprendi muitas coisas preciosas trabalhando ao lado de vocs e no posso deixar de agradecer pelo seu prossionalismo, dedicao 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 tambm a todos meus outros amigos, colegas, nerds da mesma categoria, pessoas que encontrei em conferncias, 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, Norman Richards, Chris Richardson, James Strachan, Bruce Tate, Glenn Vanderburg, Becca Wheeler e Jay Zimmerman. E, nalmente minha gratido innita ao Jack Bauer por salvar o mundo, 24 horas de cada vez.
xix

xx

Spring em Ao

Sobre este livro


O Framework Spring foi criado com um objetivo bem especco em mente tornar mais fcil o desenvolvimento de aplicaes JEE. Seguindo a mesma linha, Spring em Ao foi escrito para facilitar o aprendizado em usar o Spring. Meu objetivo no 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 prticos de cdigos extrados de experincias reais. Como Spring um framework modular, este livro foi escrito da mesma forma. Reconheo que nem todos os desenvolvedores tm as mesmas necessidades. Alguns querem aprender sobre o Framework Spring por completo, enquanto outros preferem escolher tpicos diferentes e prosseguir ao seu prprio modo. Desta forma, o livro atua como uma ferramenta de aprendizado inicial do Spring, bem como um manual e um guia de referncia para aqueles que querem se aprofundar em recursos especcos.

Guia geral
Spring em Ao - Segunda Edio est dividido em trs partes, alm de dois apndices. Cada uma das trs partes enfoca uma rea do Framework Spring: o ncleo do framework, as camadas de negcio e de dados, alm da camada de apresentao. Embora cada parte se baseie na seo anterior, cada qual pode tambm atuar individualmente, permitindo que voc mergulhe de cabea em um determinado tpico sem ter de partir do princpio. Na parte 1, voc explorar os dois recursos centrais do framework Spring: injeo de dependncia (DI) e programao orientada a aspecto (AOP). Isto dar a voc uma boa compreenso dos fundamentos do Spring a serem utilizados ao longo do livro. No captulo 1, voc ser apresentado DI e AOP, e como elas so usadas para facilitar o desenvolvimento de aplicaes em Java. O captulo 2 d uma viso mais detalhada sobre como congurar seus objetos de aplicao, usando injeo de dependncia. Voc aprender a escrever componentes de baixo acoplamento e associar suas dependncias e propriedades dentro do container do Spring usando XML. Assim que entender o bsico sobre associao de beans, voc estar pronto para ver algo dos recursos mais avanados do container do Spring no captulo 3. Entre outras coisas, aprender como atrelar ao ciclo de vida de seus componentes de aplicao, criar relacionamentos de pai/lho entre as conguraes de seus beans, e associar em componentes script escritos em Ruby e Groovy. O captulo 4 explora o uso da AOP do Spring para desacoplar propriedades transversais a partir de objetos aos quais servem. Este captulo tambm prepara a cena para os captulos posteriores, em que voc usar AOP do Spring para fornecer servios declarativos, como transaes, segurana e realizao 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 negcio e de dados de sua aplicao.

O captulo 5 abrange o suporte do Spring para persistncia de dados. Voc ser apresentado ao suporte a JDBC do Spring, que ajudar a remover muito cdigo repetitivo associado a JDBC. Voc tambm ver como o Spring integra-se a diversos frameworks de persistncia populares como Hibernate, iBATIS e Java Persistence API (JPA). O captulo 6 complementa o anterior, mostrando-lhe como assegurar integridade em seu banco de dados usando o suporte de transaes do Spring. Voc ver como o Spring utiliza a AOP para oferecer a objetos de aplicao simples a capacidade de transaes declarativas. No captulo 7 voc aprender como oferecer segurana para suas aplicaes usando Spring Security. Ver como Spring Security assegura a aplicao no nvel de solicitao da web, usando ltros servlet, e no nvel de mtodo, usando a AOP do Spring. O captulo 8 explora como expor seus objetos de aplicao como servios remotos. Voc aprender a acessar servios remotos de forma transparente como se fossem qualquer outro objeto em sua aplicao. As tecnologias remotas exploradas incluem RMI, Hessian/Burlap, servios da web com base em SOAP, alm do prprio HttpInvoker do Spring. Ainda que o captulo 8 aborde servios da web em Spring, o captulo 9 d uma viso diferente destes, examinando o projeto Spring-WS. Neste captulo voc aprender como usar Spring-WS para desenvolver servios da web com contrato pr-denido em que o contrato desacoplado a partir de sua implementao. O captulo 10 examina o Spring para enviar e receber mensagens no-sincronizadas com JMS. Alm de operaes bsicas JMS com Spring, voc aprender tambm como usar o projeto de cdigo aberto Lingo para expor e consumir servios remotos no-sincronizados em JMS. Embora Spring elimine muitas das necessidades para EJBs, voc pode precisar usar Spring e EJB juntos. Dessa forma, o captulo 11 explora como integrar Spring com EJB. Voc aprender como escrever EJBs habilitados para Spring, como associar referncias EJB em seu contexto de aplicao Spring, e at como usar anotaes tipo EJB para congurar seus beans do Spring. Terminada a parte 2, o captulo 12 lhe mostrar como usar o Spring para agendar tarefas, enviar e-mails, acessar recursos congurados para JNDI e gerenciar objetos de sua aplicao com JMX. A parte 3 move a discusso do Spring um pouco mais prximo do usurio nal, vendo os modos de usar Spring para desenvolver aplicaes da web. O captulo 13 apresenta o prprio framework web MVC do Spring. Voc descobrir como o Spring pode ligar de forma transparente parmetros web aos seus objetos de negcios, e proporcionar controle de erros e validao ao mesmo tempo. Ver tambm o quo fcil acrescentar funcionalidade s suas aplicaes web, usando o rico conjunto de controles Spring. Continuando de onde o 13 parou, o captulo 14 abrange a camada de viso do MVC Spring. Neste captulo, voc aprender como mapear a produo de um controlador MVC Spring para um componente de visualizao especca para renderizar o usurio. Voc ver como denir visualizaes de aplicao usando JSP Velocity, FreeMarker e Tiles. Aprender tambm , como criar uma sada no-HTML como PDF, Excel e RSS, a partir de MVC Spring. O captulo 15 explora o Spring Web Flow, uma extenso para MVC Spring que habilita o desenvolvimento de aplicaes web conversacionais. Neste captulo voc aprender como desenvolver aplicaes da web que guiaro o usurio atravs de um uxo especco. Finalmente, o captulo 16 mostrar como integrar Spring a outros frameworks web. Se voc
xxi

xxii

Spring em Ao

j tiver feito um investimento em outro framework web (ou apenas prefere outro), este captulo para voc. Ver como o Spring fornece suporte para diversos dos mais populares frameworks web, incluindo Struts, WebWork, Tapestry e JavaServer Faces (JSF). O Apndice A far voc iniciar sua aplicao, mostrando como baixar e congurar o Spring em Ant ou em Maven 2. Um dos benefcios-chave de baixo acoplamento que facilita o teste de unidade dos objetos de sua aplicao. O Apndice B mostra como tirar vantagem da injeo de dependncia e de algumas classes orientadas a teste do Spring para testar suas aplicaes.

Contedo adicional da web


Conforme escrevia esse livro, desejava abranger o mximo possvel sobre o Spring. Deixei me levar e acabei escrevendo mais do que cabia no livro impresso. Assim como muitos lmes de Hollywood, muito material acaba indo para a sesso de cortes: Construo de aplicaes portlet - este captulo abrange o framework Portlet MVC Spring. O Portlet MVC Spring bastante similar ao MVC Spring (inclusive reutiliza algumas de suas classes), mas instalado para circunstncias especiais apresentadas pelos aplicativos portlet. Apndice C,Referncia de configurao de XML do Spring este apndice documenta todos os elementos de congurao XML disponveis em Spring 2.0. Alm disso, inclui o elemento de congurao para Spring Web Flow e Direct Web Remoting (DWR). Apndice D,Referncia de biblioteca de tag JSP do Spring este apndice documenta todas as tags JSP, tanto as tags JSP originais do Spring quanto as novas tags de associao a formulrios do Spring 2.0. Apndice E,Referncia de definio Spring Web Flow este apndice cataloga todos os elementos de XML que so utilizados para denir um uxo para Spring Web Flow. Apndice F,Personalizao de configurao do Spring este apndice, que originalmente era parte do captulo 3, mostra como criar namespaces personalizados de congurao do XML do Spring. H algum bom material a e no queramos que o trabalho fosse por nada. Por isso ele est disponvel para download de graa e em ingls. Voc pode baixar este material extra on-line em: http://www.altabooks.com.br.

Quem deve ler este livro


O Spring em Ao Segunda Edio foi feito para todos os desenvolvedores Java, mas os que esto no mundo corporativo vo consider-lo particularmente til. Embora o guiaremos suavemente atravs dos exemplos de cdigo que desenvolvemos de forma complexa ao longo de cada captulo, a verdadeira fora do Spring consiste em sua capacidade de tornar mais fcil o desenvolvimento de aplicaes corporativas. Por isso, os desenvolvedores corporativos apreciaro plenamente os exemplos apresentados neste livro. Como uma vasta poro do Spring devotada em fornecer servios corporativos, muitos paralelos podem ser traados entre este e o EJB. Dessa forma, qualquer experincia que voc possua ser til ao fazer comparaes entre esses dois frameworks.

Finalmente, embora este livro no esteja exclusivamente focalizado em aplicativos web, uma boa parte dele dedicada a este tpico. De fato, os quatro captulos 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.

Convenes de cdigo
H diversos exemplos de cdigos neste livro. Esses exemplos aparecero sempre numa fonte de cdigo especca. Se houver uma parte do exemplo que desejamos que voc preste ateno extra, ela aparecer numa fonte de cdigo com negrito. Todos os nomes de classe, nome de mtodo ou fragmento de XML dentro do texto normal do texto aparecer em fonte de cdigo especco tambm. Muitas classes e pacotes do Spring tm nomes excepcionalmente longos (mas expressivos). Por causa disto, podem ser includos marcadores de continuao de linha ( ) quando necessrio. Nem todos os exemplos de cdigo neste livro esto completos. Geralmente mostramos apenas um ou dois mtodos de uma classe para focalizar um tpico em particular. O cdigo-fonte completo para a aplicao 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 prossional de software com mais de 13 anos de experincia e co-autor do XDoclet in Action (Manning, 2003). um vido defensor do Framework Spring, dando freqentes palestras e conferncias para grupos de usurios locais e escrevendo sobre Spring em seu blog. Quando no est criando cdigo, Craig passa sempre que pode o tempo com sua esposa, duas lhas, seis pssaros, quatro ces, dois gatos e um nmero sempre utuante de peixes tropicais. Craig vive em Denton, Texas.

Author On-line
A aquisio do Spring em Ao inclui livre acesso a um frum web privado (em ingls) mantido pela Manning Publications em que voc pode fazer comentrios sobre o livro, propor questes tcnicas e receber ajuda dos autores e de outros usurios. Para acessar o frum e inscrever-se entre em www.manning.com/ walls3 ou www.manning.com/SpringinAction. Esta pgina fornece as informaes sobre como conseguir acessar o frum, uma vez que voc esteja registrado, que tipo de ajuda est disponvel e as regras de conduta. O compromisso da Manning com seus leitores fornecer um foro em que um dilogo signicativo possa ter lugar entre leitores individuais e entre leitores e o autor. No h um compromisso para qualquer quantidade especca de participaes por parte do autor, cuja contribuio no frum permanece voluntria (e no-remunerada). Sugerimos que voc tente propor ao autor algumas questes desaadoras para que o interesse dele no se disperse! O frum Author On-line e os arquivos dos debates anteriores estaro acessveis no site da web da editora enquanto o livro (em ingls) estiver em circulao.
xxiii

xxiv

Spring em Ao

Sobre o ttulo
Combinando apresentaes, aspectos gerais e exemplos prticos, os livros da srie Em Ao so projetados para ajudar no aprendizado e na recapitulao. De acordo com pesquisas em cincia cognitiva, as coisas das quais as pessoas se recordam so aquelas que descobriram durante explorao automotivada. Embora ningum na Manning seja um cientista cognitivo, estamos convencidos de que, para o aprendizado se tornar permanente, deve passar pelos estgios de explorao, execuo e, de forma interessante, recapitulao do que est sendo aprendido. As pessoas compreendem e relembram coisas novas, o que quer dizer que as assimilaram somente aps explor-las ativamente. O homem aprende em ao. Parte essencial de um guia Em Ao sua orientao atravs de exemplos. Isso incentiva o leitor a tentar algo alm, a experimentar novos cdigos e a explorar novas idias. Existe uma outra e mais trivial razo para o ttulo deste livro: nossos leitores so pessoas ocupadas. Usam nossos livros para fazer uma tarefa ou resolver um problema. Precisam de livros que lhes permitam avanar e retroceder facilmente na leitura, e aprender apenas o que quiserem e quando quiserem. Precisam de livros que os auxiliem em ao. Os livros desta srie so projetos para tais leitores.

Sobre a ilustrao de capa


A gura na capa de Spring em Ao Segunda Edio um Le Caraco, ou um habitante da provncia de Karak no sudoeste da Jordnia. Sua capital a cidade de Al-Karak, que ostenta um castelo antigo no topo de uma colina com uma viso magnca do Mar Morto e das plancies que o cercam. A ilustrao foi retirada de um guia de viagem francs, Encyclopedie des Voyages, por J. G. St. Saveur, publicado em 1796. Viajar por prazer era um fenmeno relativamente novo naquele tempo, e guias de viagem como este eram populares, apresentando ao turista como tambm ao viajante de poltrona os habitantes de outras regies da Frana e do exterior. A diversidade dos desenhos na Encyclopedie des Voyages fala vividamente da singularidade e individualidade das cidades provncias do mundo e h apenas 200 anos. Era um tempo em que os cdigos de vestimenta de duas regies separadas por algumas milhas identicavam 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 distncia deste perodo e de cada perodo histrico, com exceo ao nosso prprio presente hipercintico. Os cdigos de vesturio mudaram desde ento e a diversidade por regio, to rica naquele tempo, desvaneceu. Hoje em dia difcil 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 ento por uma vida intelectual e tcnica mais variada e interessante. Ns da Manning celebramos a inventividade, a iniciativa e a diverso do negcio de computadores com capas de livros com base na rica diversidade da vida regional de sculos atrs, trazidas de volta vida pelas ilustraes deste guia de viagem.

xxv

26

Spring em Ao

Parte 1 Elementos Essenciais do Spring


Spring faz muitas coisas, mas quando voc o separa em partes centrais, os recursos principais do Spring so injeo de dependncia (DI) e programao orientada a aspecto (AOP). Iniciando no captulo 1, Como colocar Spring em ao, voc ter uma rpida viso geral de DI e AOP em Spring e ver como podem ajud-lo a desacoplar objetos de aplicativo. No captulo 2, Associao bsica de bean, daremos um olhar mais detalhado em como manter os objetos de seu aplicativo com baixo acoplamento usando DI. Voc aprender como denir os objetos de seu aplicativo e como associlos com dependncias no container do Spring usando XML. Revelando um furo no captulo 3, Associao avanada de bean, exploraremos alguns dos recursos mais avanados do container e veremos como usar algumas das tcnicas mais poderosas de congurao do Spring. O captulo 4, Como advertir beans, explora como usar os recursos AOP do Spring para desacoplar servios globais de sistema (como segurana e auditoria) a partir dos objetos aos quais servem. Este captulo estabelece o estgio para os captulos 6 e 7, em que voc aprender como usar a AOP do Spring para fornecer transaes declarativas e de segurana.

CAPTULO 1 Como colocar o Spring em ao

27

Como colocar o Spring em ao

Este captulo abrange: Explorao dos mdulos essenciais do Spring Desacoplamento de objetos de aplicativo Gerenciamento de propriedades transversais com programao orientada a aspecto (AOP)

28

Spring em Ao

Tudo comeou com um bean. Em 1996, a linguagem de programao Java ainda era uma plataforma jovem e empolgante. Muitos desenvolvedores migraram para a linguagem, porque descobriram como criar ricos e dinmicos 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 possvel escrever aplicativos completos, compostos por partes discretas. Eles vieram por causa dos applets, mas caram pelos componentes. Foi em dezembro daquele ano que a Sun Microsystems publicou as especicaes para JavaBeans 1.00-A. O JavaBeans denia um modelo de componente de software para Java. Esta especicao deniu um conjunto de polticas de cdigos que habilitavam simples objetos Java a serem reutilizados e facilmente compostos em aplicativos mais complexos. Embora o JavaBeans tivesse sido planejado com a inteno geral de denir componentes de aplicativos reutilizveis, foi usado principalmente como um modelo na construo de widgets de interfaces de usurio. Parecia simples demais para ser capaz de qualquer trabalho real. Os desenvolvedores corporativos queriam mais. Aplicativos sosticados com freqncia exigem servios como suporte de transao, segurana e computao distribuda. Servios no diretamente oferecidos pela especicao JavaBeans. Por essa razo, em maro de 1998, a Sun publicou a verso 1.0 da especicao Enterprise JavaBeans (EJB). Esta ampliou a noo dos componentes Java para o lado do servidor, fornecendo importantes servios corporativos, mas falhou ao no continuar com a simplicidade da especicao JavaBeans original. De fato, exceto pelo nome, o EJB apresenta pouqussima semelhana com a especicao JavaBeans original. Apesar do fato de que muitos aplicativos de sucesso foram desenvolvidos com base no EJB, este nunca alcanou seu propsito almejado: simplicar o desenvolvimento de aplicativos corporativos. verdade que o modelo de programao declarativa do EJB simplica muitos aspectos infraestruturais de desenvolvimento, como transaes e segurana. Contudo, na direo oposta, os EJBs complicam o desenvolvimento ao designar descritores de implantao e cdigos pesados (interfaces home e remote/local). Com o passar do tempo, muitos desenvolvedores caram desencantados com o EJB. Como resultado, sua popularidade comeou a minguar nos ltimos anos, deixando muitos desenvolvedores procura de uma maneira mais fcil de programar. Hoje em dia, o desenvolvimento de componentes em Java retornou s razes. Novas tcnicas de programao, incluindo a programao orientada a aspecto (AOP) e injeo de dependncia (DI), do ao JavaBeans muito do poder reservado anteriormente ao EJB. Estas tcnicas fornecem aos POJOs (plain-old Java objects) um modelo de programao declarativa remanescente do EJB, mas sem a sua complexidade. J no necessrio recorrer a um componente EJB de difcil controle, quando um simples JavaBean basta. Com toda a justia, at os EJBs esto empenhados em promover um modelo de programao com base em POJO. Usando idias como DI e AOP, a ltima especicao EJB signicativamente mais simples que seus predecessores. Para muitos desenvolvedores, contudo, isto se move pouco e muito tarde. No tempo em que a especicao EJB 3 entrou em cena, outros frameworks com base em POJO j tinham se estabelecido de fato como padres na comunidade Java. Liderando a iniciativa de desenvolvimento leve baseado em POJOs est o Spring Framework, que estaremos explorando ao longo deste livro. Neste captulo, exploraremos o Framework Spring num nvel elevado, dando a voc uma prova do que o Spring capaz. Este captulo dar uma boa idia dos tipos de problemas que o Spring resolve e como estabelecer o estgio para o restante do livro. Comeando do comeo vamos descobrir o que Spring.

1.1 O que Spring?

CAPTULO 1 Como colocar o Spring em ao

29

Spring um framework de cdigo 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 possvel usar simples JavaBeans para conseguir coisas que antes s eram possveis com EJBs. Porm, a utilidade do Spring no limitada ao desenvolvimento do lado do servidor. Qualquer aplicativo em Java pode se beneciar do Spring em termos de simplicidade, testabilidade e baixo acoplamento. OBSERVAO: Para evitar ambigidade, ser usado o termo bean quando se referir ao JavaBeans convencional e EJB quando for JavaBeans Enterprise. Eventualmente tambm ser usado o termo POJO (plain-old Java object). O Spring faz muitas coisas, mas quando as partes de sua base so dissecadas, um leve framework e container orientado a aspecto, com injeo de dependncia. Parece pouco, mas resume o objetivo central do Spring. Para isso fazer sentido, leia as descries abaixo: Container leve O Spring um framework leve, em termos de tamanho e sobrecarga. O Framework Spring inteiro pode ser distribudo em um nico arquivo JAR com no mximo 2.5 MB. E a sobrecarga de processamento exigida pelo Spring desprezvel. Alm disso, o Spring no invasivo: os objetos de um aplicativo habilitados pelo Spring geralmente no tm nenhuma dependncia com classes especcas deste. Injeo de Dependncia O Spring promove baixo acoplamento atravs de uma tcnica conhecida como injeo de dependncia (DI). Quando a DI for aplicada, os objetos so passivamente colocados em suas dependncias, no lugar de criarem ou procurarem por objetos dependentes. possvel pensar em DI como JNDI s avessas no lugar de um objeto pesquisar por dependncias em um container, este que d as dependncias ao objeto imediatamente, sem esperar ser requisitado. Orientado a Aspecto O Spring vem com um rico suporte para programao orientada a aspecto (AOP), que permite um desenvolvimento coeso, separando a lgica de negcio dos aplicativos, dos servios de sistema (como auditoria e gerenciamento de transao). Objetos de aplicativo fazem o que tm de fazer executar a lgica de negcios e nada mais. No so responsveis por (ou at mesmo cientes de) outras preocupaes do sistema, como realizao de log ou suporte transacional. Container O Spring um container no sentido em que contm e gerencia o ciclo de vida e a congurao de objetos do aplicativo. Em Spring, possvel declarar como cada objeto de suas aplicaes deve ser criado, congurado e associado entre si. Framework O Spring torna possvel congurar e compor aplicativos complexos a partir de componentes mais simples. No Spring, os objetos de aplicativo so compostos de modo declarativo, geralmente em um arquivo XML. O Spring tambm fornece muita funcionalidade de infra-estrutura (gerenciamento de transao, integrao de framework de persistncia, etc), deixando o desenvolvimento da lgica de aplicao para voc. Recapitulando: Quando as partes da base do Spring so dissecadas, o que se obtm um framework que ajuda no desenvolvimento de cdigo de aplicativo com baixo acoplamento. Mesmo se isso fosse tudo o que pudesse fazer, os benefcios 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 srie de mdulos construdos a partir da base de injeo de dependncia e AOP, e cria uma plataforma cheia de recursos, sobre a qual se constroem os aplicativos.

30

Spring em Ao

1.1.1 Mdulos do Spring


O Framework Spring composto de vrios mdulos bem denidos (veja a gura 1.1). Ao serem tomados como um todo, estes mdulos fornecem tudo o que necessrio para desenvolver aplicativos para solues corporativas (enterprise-ready). Mas no necessrio ter o Framework Spring como base para seus aplicativos. Voc livre para escolher os mdulos que se adaptem aos seus aplicativos e buscar por outras opes quando o Spring no for apropriado. De fato, o Spring oferece pontos de integrao com diversos outros frameworks e bibliotecas, de maneira que no tenha que desenvolv-los por si prprio.
MVC Portlet ORM Web

Remotabilidade

AOP

JMX

JCA

JMS MVC

DAO

Contexto

Ncleo

Figura 1.1 O Framework Spring composto de vrios mdulos bem denidos construdos em cima do container base. Esta modularidade torna possvel usar mais ou menos do Framework Spring conforme o necessrio num aplicativo particular.

Como se pode observar, todos os mdulos do Spring so construdos em cima do container base. O container dene como os beans so criados, congurados e gerenciados entre algumas das loucuras do Spring. possvel usar estas classes implicitamente ao congurar seu aplicativo. Mas como desenvolvedor, provavelmente voc est interessado nos outros mdulos que alavancam os servios fornecidos pelo container. Estes mdulos fornecem os frameworks com os quais voc desenvolve seus servios de aplicativo, como AOP e persistncia. Vamos dar uma olhada em cada mdulo na gura 1.1, um de cada vez, para ver como se ajustam no quadro geral do Spring.

O container base
Muito da base da gura 1.1, voc encontrar no container base do Spring. Este fornece a funcionalidade fundamental do Framework Spring. Este mdulo contm o BeanFactory, que o container fundamental do Spring e a base na qual a DI se fundamenta. Discutiremos o mdulo base (o centro de qualquer aplicativo Spring) ao longo deste livro, iniciando no captulo 2, quando examinaremos a associao de beans usando DI.

Mdulo de contexto de aplicativo


O contexto de aplicativo do Spring desenvolvido sobre o container base. O BeanFactory do mdulo base faz do Spring um container, mas o mdulo de contexto o que o torna um

framework. Este mdulo estende o conceito do BeanFactory, acrescentando suporte para mensagens internacionalizadas (I18N), eventos de ciclo de vida e validao. Alm do mais, este mdulo fornece muitos servios corporativos como e-mail, acesso a JNDI, integrao com EJB, remotabilidade, e agendamento. Tambm est includo suporte para integrao com frameworks de modelagem, como Velocity e FreeMarker.

CAPTULO 1 Como colocar o Spring em ao

31

Mdulo AOP do Spring


O Spring fornece rico suporte para programao orientada a aspecto em seu mdulo AOP. Este mdulo serve como base para o desenvolvimento dos seus prprios aspectos para seus aplicativos habilitados por Spring. Como a DI, a AOP tem suporte para baixo acoplamento de objetos de aplicativo. Com a AOP, porm, requisitos especcos de aplicao (como transaes e segurana) so desacoplados dos objetos nos quais esto aplicados. O mdulo 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 captulo 4.

A abstrao do JDBC e o mdulo DAO


Trabalhar com JDBC freqentemente resulta numa grande quantidade de cdigo repetitivo que obtm uma conexo, cria uma declarao, processa um conjunto de resultados e fecha a conexo. O mdulo JDBC e Data Access Objects (DAO) do Spring abstrai o cdigo repetitivo de maneira que voc possa manter seu cdigo do banco de dados limpo e simples, alm de prevenir problemas que resultam da falha em fechar os recursos do bancos de dados. Este mdulo tambm constroem uma camada de excees signicativas em cima das mensagens de erro dadas por vrios servidores de banco de dados. Tentar decifrar mensagens de erro crpticas ou de SQL proprietrio: nunca mais! Alm disso, este mdulo utiliza outro, o de AOP do Spring, para fornecer servios de gerenciamento de transaes para objetos num aplicativo Spring. Veremos como a abstrao de JDBC com base em modelo pode simplicar muito o cdigo JDBC quando examinarmos o acesso a dados do Spring no captulo 5.

Mdulo de integrao 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 mdulo ORM. O suporte do ORM do Spring construdo sobre o suporte de DAO, fornecendo um modo conveniente para desenvolver DAOs a vrias solues ORM. O Spring no tenta implementar sua prpria soluo ORM, mas fornece integraes 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. Alm da abstrao JDBC com base em modelo do Spring, veremos como o Spring fornece uma abstrao similar para frameworks ORM e de persistncia no captulo 5.

Java Management Extensions (JMX)


Expor os trabalhos internos de um aplicativo Java para gerenciamento a parte crtica de pegar uma produo de aplicativo pronta. O mdulo JMX do Spring facilita a exposio de seus beans de aplicativo como JMX MBeans. Isso torna possvel o monitoramento e a recongurao de um aplicativo em execuo. Daremos uma olhada no suporte do Spring para JMX no captulo 12.

32

Spring em Ao

Java EE Connector API (JCA)


O cenrio do aplicativo corporativo cheio de mistura de aplicativos em execuo 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 informao corporativos, incluindo mainframes e banco de dados. De vrias maneiras, o JCA muito parecido com JDBC, com exceo de que enquanto o JDBC tem o foco no acesso ao banco de dados, a JCA uma API com propsitos mais gerais de conexo a sistemas legados. O suporte Spring para JCA similar ao do JDBC, abstraindo cdigo repetitivo do JCA nos modelos.

O framework MVC de Spring


O paradigma Modelo/Viso/Controlador (MVC) uma abordagem geralmente aceita para construir aplicativos web tais que a interface de usurio separada da lgica de aplicao. O Java no tem escassez de frameworks MVC, com Apache Struts, JSF, WebWork e Tapestry entre as opes mais populares. Embora o Spring possa ser integrado com vrios frameworks MVC populares, vem com seu excelente framework que promove tcnicas de baixo acoplamento na camada da web de um aplicativo. Faremos um aprofundamento em MVC do Spring nos captulos 13 e 14.

MVC Portlet do Spring


Muitos dos aplicativos web possuem base em pgina isto , cada solicitao resulta uma pgina completamente nova sendo apresentada.. Cada pgina normalmente apresenta uma parte especca das informaes ou solicita ao usurio com um formulrio especco. Em contraste, aplicativos com base em portlet agregam diversas funcionalidades em uma nica pgina da web. Isto fornece uma viso em vrios 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 construdo sobre o MVC do Spring para fornecer um conjunto de controladores que possuam suporte para API portlet de Java.

O mdulo web do Spring


O MVC do Spring e o MVC Portlet do Spring exigem uma considerao especial ao carregarem o contexto do aplicativo do Spring. Dessa forma, o mdulo web do Spring fornece classes de suporte especial para MVC do Spring e MVC Portlet do Spring. O mdulo web tambm contm suporte para diversas tarefas orientadas a web, como upload de arquivos e associao programtica de parmetros de requisio para seus objetos de negcio. Tambm contm suporte de integrao com o Apache Struts e o JavaServer Faces (JSF).

Remotabilidade
Nem todos os aplicativos trabalham sozinhos. s vezes, necessrio que um aplicativo alavanque a funcionalidade de outro aplicativo para conseguir fazer seu trabalho. Quando outro aplicativo acessado atravs da rede, alguma forma de remotabilidade utilizada para a comunicao. O suporte para remoting do Spring permite que voc exponha a funcionalidade de seus objetos Java como objetos remotos. Ou se for necessrio acessar os objetos remotamente, o mdulo

remoting tambm facilita o trabalho de associao de objetos remotos em seus aplicativos como se fossem POJOs locais. Muitas opes de remoting esto disponveis, incluindo o Remote Method Invocation (RMI), Hessian, Burlap, JAX-RPC e prprio invocador HTTP do Spring. No captulo 8, exploraremos as diversas opes de remoting com suporte em Spring.

CAPTULO 1 Como colocar o Spring em ao

33

Java Message Service (JMS)


A desvantagem do remoting que o mesmo depende da conabilidade da rede e que as extremidades da comunicao estejam disponveis. A comunicao orientada a mensagem, por outro lado, mais convel e garante a entrega das mensagens, mesmo se a rede e os pontos nais no sejam conveis. O mdulo Java Message Service (JMS) do Spring ajuda a enviar mensagens para las e tpicos de mensagens JMS. Ao mesmo tempo, este mdulo tambm auxilia na criao de POJOS dirigidos a mensagem que so capazes de consumir mensagens no-sincronizadas. Veremos como usar Spring para enviar mensagens no captulo 10. Embora o Spring cubra um bocado de cho, importante observar que o mesmo evita a reinveno da roda sempre que possvel. O Spring baseia-se fortemente em APIs e frameworks existentes. Por exemplo, como veremos no captulo 5, o Spring no implementa seu prprio framework de persistncia em vez disso, estimula a integrao com vrios frameworks de persistncia 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 experincia associando nosso primeiro bean num container do Spring.

1.2 O incio com Spring


A injeo de dependncia a coisa mais bsica que o Spring faz. Mas com o que a DI se parece? Na grande tradio de livros de programao, iniciaremos mostrando-lhe como o Spring trabalha com o exemplo Hello World. Ao contrrio do programa original Hello World, este exemplo ser um pouco diferente para demonstrar as noes bsicas do Spring. A primeira classe que o exemplo Hello World Springicado precisa uma classe de servio, cujo propsito imprimir a nossa familiar saudao. A listagem 1.1 mostra a interface GreetingService, que dene o contrato para a classe de servio. Listagem 1.1 A interface para um servio de saudao
package com.springinaction.chapter01.hello; public interface GreetingService { void sayGreeting(); }

GreetingServiceImpl (listagem 1.2) implementa a interface GreetingService. Embora no seja necessrio esconder a implementao atrs de uma interface, altamente recomendado como uma maneira de separar a implementao do seu contrato. Listagem 1.2 GreetingServiceImpl, que imprime uma saudao agradvel

package com.springinaction.chapter01.hello; public class GreetingServiceImpl implements GreetingService { private String greeting; public GreetingServiceImpl() {} public GreetingServiceImpl(String greeting) {