Вы находитесь на странице: 1из 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

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

Parte 2

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


1

Como colocar Spring em ao

Associao bsica de bean

Associao avanada de bean

Como advertir beans

25
57

91

Spring na camada de negcios .............................................121


5

Como acessar o banco de dados

Como gerenciar transaes

Como assegurar aplicaes Spring

Spring e servios remotos com base em POJO

123

175
197
243

9 Como desenvolver servios web com contrato pr-definido (contract-first)


em Spring 275

Part 3

10

Como transmitir mensagens Spring

11

Spring e Enterprise JavaBeans

12

Como acessar servios corporativos

307

337
351

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


13

Como tratar requisies web

14

Como fazer a renderizao de views web

15

Como utilizar o Spring Web Flow

16

Como trabalhar com outros frameworks web

389

Como configurar o Spring

Apndice B

Como realizar testes com (e sem) Spring

ndice remissivo 557

463

531

Apndice A

425

541

497

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

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

12

19

24

Associao bsica de bean 25

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

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

29

34

39

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

53

56

Associao avanada de bean 57

3.1 Como declarar beans de pai e filho 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

60

66

67

3.4 Como registrar editores personalizados de propriedade

69

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

4
4.1

89

Como advertir beans 91


Introduo a AOP 93
Como definir a terminologia da AOP

93

Suporte para AOP do Spring

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

4.4 Declarao de aspectos POJO puros


4.5 Como injetar aspectos AspectJ
4.6 Resumo

119

117

113

110

104

96

88

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

Como acessar o banco de dados 123

5.1 Como aprender a filosofia 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 configurar 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

138

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

Como realizar proxy de beans

173

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

189

195

Como assegurar aplicaes Spring 197

7.1 Introduo a Spring Security

198

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

239

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

Spring e servios remotos com base em POJO 243

8.1 Uma viso geral do remotabilidade do Spring


8.2 Como trabalhar com RMI 247
Como associar servios RMI 247

244

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

249

254

8.4 Como utilizar HttpInvoker do Spring 257


Como expor beans como servios HTTP
Como acessar servios via HTTP 257

258

8.5 Spring e servios web 260


Como declarar servios web
Como exportar beans como servios web usando XFire 260
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-definido


(contract-first) em Spring 275

9.1 Introduo a Spring-WS

277

9.2 Definio 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

10

306

Como transmitir mensagens Spring 307

10.1 Uma breve introduo a JMS 308


Como fazer arquitetura JMS 309
Avaliao dos benefcios de JMS
Como configurar ActiveMQ em Spring 313

311

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

11

336

Spring e Enterprise JavaBeans 337

11.1 Como acessar EJBs no Spring 338


Como fazer proxy em beans de seo (EJB 2.x)
xi

339

xii

Spring em Ao

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 346


Introduo ao Pitchfork 346
Pitchfork 347
Como injetar recursos via anotao
348
Como declarar interceptores atravs de anotaes 349
11.4 Resumo

12

350

Como acessar servios corporativos 351

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 injetar objetos JNDI

Como criar o e-mail

360

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

355

Acesso remoto a MBeans

365

380

386

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

13

Como tratar requisies web 389

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

392

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

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

429

436

14.3 Como modelar o layout das pginas com Tiles 438


Views Tile 438
Como criar control lers de Tile 441
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

15

449

456

460

Como utilizar o Spring Web Flow 463

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 fluxo 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

469

479

15.3 Tcnicas avanadas de fluxos 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

16

493

495

Como trabalhar com outros frameworks web 497

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

Como declarar actions do Struts


502
E o Struts 2? 504
505

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

Apndice A: Como configurar o Spring

531

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


ndice remissivo

541

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

Referncia de configurao de XML do Spring

Apndice D

Referncia de biblioteca de tag JSP do Spring

Apndice E

Referncia de definio Spring Web Flow

Apndice F

Personalizao de configurao 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 ficamos 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 significativo 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:
Configurao de XML simplificada e a opo de criar elementos personalizados
de configurao
AOP e transaes muito simplificadas
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 configurao sobre conveno para reduzir a quantidade
de XML exigido para configurar Spring
Suporte para Java Persistence API (JPA)
Definio 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 justificava o salto para 2.0, como poderiam estar aptos para justificar 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 fluxos
XFire, para exportar seus beans do Spring como servios da web SOAP
Spring-WS para criar servios da web com contratos pr-definidos
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 justificavam uma segunda
edio do Spring em Ao, o que justificaria? 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 florescendo 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 significava colocar um remendo
que fosse to feio a ponto de voc depois se sentir sujo significava 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 configurao 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 especfica
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 configurao 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 fina 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 fizeram 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 fim. Desculpe se demorou tanto. Agora que acabou, prometo-lhe mais flores 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 profissionalismo, 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, finalmente minha gratido infinita 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 especfico 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 especficos.

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 configurar 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/filho entre as configuraes 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 filtros 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-definido 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 configurar 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 configurados para JNDI e gerenciar objetos de sua aplicao
com JMX.
A parte 3 move a discusso do Spring um pouco mais prximo do usurio final, 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 especfica para renderizar o usurio. Voc ver como
definir 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 fluxo especfico.
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 configurar 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
filmes 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 configurao XML disponveis em Spring 2.0. Alm disso, inclui o
elemento de configurao 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 definir um fluxo 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 configurao
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 finais 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 especfica. 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 especfico 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 profissional 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 filhas, seis pssaros, quatro ces, dois gatos e um nmero
sempre flutuante 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
significativo possa ter lugar entre leitores individuais e entre leitores e o autor. No h um
compromisso para qualquer quantidade especfica de participaes por parte do autor,
cuja contribuio no frum permanece voluntria (e no-remunerada). Sugerimos que
voc tente propor ao autor algumas questes desafiadoras 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 figura 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 magnfica 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 identificavam
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
O

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 definir 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 configurao 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 ficaram pelos componentes.
Foi em dezembro daquele ano que a Sun Microsystems publicou as especificaes para JavaBeans
1.00-A. O JavaBeans definia um modelo de componente de software para Java. Esta especificao
definiu 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 definir 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 sofisticados com freqncia exigem servios como suporte de transao,
segurana e computao distribuda. Servios no diretamente oferecidos pela especificao
JavaBeans. Por essa razo, em maro de 1998, a Sun publicou a verso 1.0 da especificao
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 especificao JavaBeans original. De fato, exceto pelo nome, o EJB
apresenta pouqussima semelhana com a especificao JavaBeans original.
Apesar do fato de que muitos aplicativos de sucesso foram desenvolvidos com base no EJB, este
nunca alcanou seu propsito almejado: simplificar o desenvolvimento de aplicativos corporativos.
verdade que o modelo de programao declarativa do EJB simplifica 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 ficaram
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 especificao EJB significativamente
mais simples que seus predecessores. Para muitos desenvolvedores, contudo, isto se move pouco
e muito tarde. No tempo em que a especificao 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 beneficiar 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 especficas 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 configurao de objetos do aplicativo. Em Spring, possvel declarar como
cada objeto de suas aplicaes deve ser criado, configurado e associado entre si.
Framework O Spring torna possvel configurar 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 definidos (veja a figura 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

AOP

Remotabilidade

Web

JMX

JCA

JMS
MVC
Contexto

DAO

Ncleo

Figura 1.1 O Framework Spring composto de vrios mdulos bem definidos 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 define como os beans so criados, configurados e gerenciados entre
algumas das loucuras do Spring. possvel usar estas classes implicitamente ao configurar 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 figura 1.1, um de cada vez, para ver como se
ajustam no quadro geral do Spring.

O container base
Muito da base da figura 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

CAPTULO 1
Como colocar o Spring em ao

31

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.

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 especficos 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 significativas 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 simplificar 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
reconfigurao 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 especfica das informaes ou solicita ao usurio com um formulrio especfico.
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

CAPTULO 1
Como colocar o Spring em ao

33

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.

Java Message Service (JMS)


A desvantagem do remoting que o mesmo depende da confiabilidade da rede e que as
extremidades da comunicao estejam disponveis. A comunicao orientada a mensagem,
por outro lado, mais confivel e garante a entrega das mensagens, mesmo se a rede e
os pontos finais no sejam confiveis.
O mdulo Java Message Service (JMS) do Spring ajuda a enviar mensagens para filas 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 Springificado precisa uma classe de servio,
cujo propsito imprimir a nossa familiar saudao. A listagem 1.1 mostra a interface
GreetingService, que define 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) {

Вам также может понравиться