Pro Spring ROB HARROP AND JAN MACHACEK Pro Spring Copyright © 2005 by Rob Harrop and Jan Machacek All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN (pbk): 1-59059-461-4 Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Lead Editor: Steve Anglin Technical Reviewer: Dmitriy Kopylenko Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis, Jason Gilmore, Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser Project Manager: Kylie Johnston Copy Edit Manager: Nicole LeClerc Copy Editor: Rebecca Rider Production Manager: Kari Brooks-Copony Production Editor: Janet Vail Compositor: Susan Glinert Stevens Proofreader: April Eddy Indexer: John Collin Artist: April Milne Cover Designer: Kurt Krames Manufacturing Manager: Tom Debolski Distributed to the book trade in the United States by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013, and outside the United States by Springer-Verlag GmbH & Co. KG, Tiergartenstr. 17, 69112 Heidelberg, Germany. In the United States: phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or visit http://www.springer-ny.com. Outside the United States: fax +49 6221 345229, e-mail [email protected], or visit http://www.springer.de. For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http://www.apress.com. The information in this book is distributed on an “as is” basis, without warranty. Although every precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work. The source code for this book is available to readers at http://www.apress.com in the Downloads section. This book is dedicated to all my friends and family who supported me during the long hours of writing, especially my girlfriend, Sally, who somehow manages to put up with having a computer geek for a boyfriend. —Rob Harrop To my parents for always being supportive and loving, and to my sister, Marie, for being a great sister. —Jan Machacek Contents at a Glance Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xix Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxi Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxiii PART 1 Getting Started with Spring ■ ■ ■ CHAPTER 1 Introducing Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 CHAPTER 2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 CHAPTER 3 The Sample Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 PART 2 Spring Basics ■ ■ ■ CHAPTER 4 Introducing Inversion of Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 CHAPTER 5 Beyond the Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 PART 3 Aspect Oriented Programming ■ ■ ■ with Spring CHAPTER 6 Introducing Spring AOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 CHAPTER 7 More on Spring AOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 PART 4 Data Access with Spring ■ ■ ■ CHAPTER 8 Spring JDBC Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 CHAPTER 9 Using Hibernate in Spring Applications . . . . . . . . . . . . . . . . . . . . . . . 279 CHAPTER 10 iBATIS Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 v vi ■CONTENTS AT A GLANCE PART 5 Spring in the Middle Tier ■ ■ ■ CHAPTER 11 Designing and Implementing Spring-Based Applications . . . . . . 353 CHAPTER 12 Transaction Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 CHAPTER 13 Spring and J2EE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 CHAPTER 14 Job Scheduling with Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 CHAPTER 15 Mail Support in Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 CHAPTER 16 Using Spring Remoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 PART 6 Web Applications with Spring ■ ■ ■ CHAPTER 17 Web Applications with Spring MVC . . . . . . . . . . . . . . . . . . . . . . . . . . 599 CHAPTER 18 Beyond JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645 CHAPTER 19 Spring and Struts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679 PART 7 Appendixes ■ ■ ■ APPENDIX A Testing with Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 APPENDIX B The Spring Rich Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711 APPENDIX C Spring IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729 APPENDIX D The Future of Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743 INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 CCoonntteennttss Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xix Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxi Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxiii PART 1 Getting Started with Spring ■ ■ ■ ■CHAPTER 1 Introducing Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 What Is Spring? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 The Spring Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Alternatives to Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 The Rest of the Book. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ■CHAPTER 2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Obtaining the Spring Framework. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Understanding Spring Packaging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Analyzing Spring Dependencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 The Sample Applications. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Spring Documentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Verifying Your Spring Distribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Putting a Spring into Hello World. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 ■CHAPTER 3 The Sample Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Requirements of the SpringBlog Application . . . . . . . . . . . . . . . . . . . . . . . 36 Implementing SpringBlog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 vii viii ■CONTENTS PART 2 Spring Basics ■ ■ ■ ■CHAPTER 4 Introducing Inversion of Control . . . . . . . . . . . . . . . . . . . . . . . . . 49 Inversion of Control and Dependency Injection . . . . . . . . . . . . . . . . . . . . . 50 Types of Inversion of Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Inversion of Control in Spring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Dependency Injection with Spring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Configuring the BeanFactory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 ■CHAPTER 5 Beyond the Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Spring’s Impacts on Application Portability. . . . . . . . . . . . . . . . . . . . . . . . . 94 Bean Lifecycle Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Making Your Beans “Spring Aware” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Using Method Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Using FactoryBeans. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 JavaBeans PropertyEditors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 The Spring ApplicationContext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 PART 3 Aspect Oriented Programming ■ ■ ■ with Spring ■CHAPTER 6 Introducing Spring AOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 AOP Concepts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Types of AOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 AOP in Spring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Advisors and Pointcuts in Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 All About Proxies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 ■CONTENTS ix ■CHAPTER 7 More on Spring AOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 Advanced Use of Pointcuts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Getting Started with Introductions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Framework Services for AOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 AspectJ Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 AOP in the Sample Application. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 PART 4 Data Access with Spring ■ ■ ■ ■CHAPTER 8 Spring JDBC Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 Exploring the JDBC Infrastructure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 Spring JDBC Infrastructure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Database Connections and DataSources . . . . . . . . . . . . . . . . . . . . . . . . . 254 Using DataSources in DAO Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 The JdbcTemplate Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Selecting the Data as Java Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Updating Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Inserting Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Transactions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 Why JDBC?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Using JDBC Data Access in the Sample Application . . . . . . . . . . . . . . . . 275 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 ■CHAPTER 9 Using Hibernate in Spring Applications . . . . . . . . . . . . . . . . . 279 What Is Hibernate?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 The Hibernate Query Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Selecting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Updating and Inserting Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 Using Hibernate in the Sample Application. . . . . . . . . . . . . . . . . . . . . . . . 303 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 x ■CONTENTS ■CHAPTER 10 iBATIS Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 What Is iBATIS? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 Mapping Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 Selecting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 Updating Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Deleting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339 Inserting Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 What Is Missing? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 Overall Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 Using iBATIS in the Sample Application . . . . . . . . . . . . . . . . . . . . . . . . . . 345 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 PART 5 Spring in the Middle Tier ■ ■ ■ ■CHAPTER 11 Designing and Implementing Spring-Based Applications . . . 353 Designing to Interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 Building a Domain Object Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 Designing and Building the Data Access Tier. . . . . . . . . . . . . . . . . . . . . . 370 Designing the Business Tier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 ■CHAPTER 12 Transaction Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Exploring the Spring Transaction Abstraction Layer . . . . . . . . . . . . . . . . 395 Analyzing Transaction Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 Exploring a Transaction Management Sample. . . . . . . . . . . . . . . . . . . . . 399 Working with Transactions Over Multiple Transactional Resources . . . 420 Transactions in the Sample Application . . . . . . . . . . . . . . . . . . . . . . . . . . 432 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 ■CHAPTER 13 Spring and J2EE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 Spring and JNDI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 Spring and EJB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 Spring and JMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 ■CONTENTS xi ■CHAPTER 14 Job Scheduling with Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 Scheduling Jobs Using JDK Timer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 Scheduling Jobs Using Quartz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 Job Scheduling Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 ■CHAPTER 15 Mail Support in Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 The Spring Mail API Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 Sending Simple E-Mails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 Constructing and Sending MIME Messages. . . . . . . . . . . . . . . . . . . . . . . 526 Using Spring Mail with Velocity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 ■CHAPTER 16 Using Spring Remoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 Remoting, Spring, and EJB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 Spring Remoting Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 Remote Method Invocation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 Web Services with JAXRPC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 Spring HTTP Invoker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577 Hessian and Burlap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 Choosing a Remoting Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 PART 6 Web Applications with Spring ■ ■ ■ ■CHAPTER 17 Web Applications with Spring MVC . . . . . . . . . . . . . . . . . . . . . 599 What Is MVC?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 Introducing Spring MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601 Using Handler Mappings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602 Using Handler Interceptors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603 Working with Controllers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604 Views, Locales, and Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 Using Command Controllers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623 Using Spring MVC in the Sample Application. . . . . . . . . . . . . . . . . . . . . . 639 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Description: