Spring高级程序设计(图灵程序设计丛书)
分類: 图书,计算机与互联网,程序语言与软件开发,语言与开发工具,Java,Spring,
品牌: 马哈切克(Manchacek.J.)
基本信息·出版社:人民邮电出版社
·页码:764 页
·出版日期:2009年09月
·ISBN:711521204X/9787115212047
·条形码:9787115212047
·包装版本:第1版
·装帧:平装
·开本:16
·正文语种:中文
·丛书名:图灵程序设计丛书
产品信息有问题吗?请帮我们更新产品信息。
内容简介《Spring高级程序设计》对Spring开发框架的核心概念及关键模块进行了深入剖析,并结合示例展示了它们的具体应用。《Spring高级程序设计》共分4部分。第一部分介绍Spring框架的基础知识,重点阐述了AOP和IOC的基本概念;第二部分介绍Spring对数据持久化的支持,从基础的JDBC开始,讲解了Spring对应用最广泛的ORM框架iBATIS和Hibernate的支持;第三部分阐述了Spring企业级组件,介绍了任务调度、Mail服务、动态语言等企业级组件相关的知识;第四部分阐述如何使用Spring进行Java EE 5开发,从远程调用和事务管理开始,接着介绍了Spring MVC、Web工作流、AJAX、JMX、单元测试以及性能调优等Java EE相关开发知识。《Spring高级程序设计》由Spring框架核心开发人员撰写,适合各层次Java开发人员,特别是企业级Java开发人员阅读参考。
作者简介Jan Machacek Cake,解决方案的首席软件架构师,在所有项目的架构讨论中他都是核心人物。除了软件架构,Jan也经常为实现一些最复杂和最具挑战性的功能提供帮助。自从加入了Cake项目以来,Jan不但参与了各种各样复杂的项目,还出版了不少技术专著,证明了他在Java开发领域的高深造诣。闲暇之余,Jan热衷于自行车运动,是曼彻斯特自行车俱乐部会员。不管是计时赛还是公路赛,他都全力争胜!
Jan负责第1~4、6、9、11、14、16、22章的撰写。
Aleksa Vukotic Cake,解决方案的软件架构师,负责大部分Cake项目的架构及实现。他在Java EE方面,特别是在Sping MVC应用开发和安全领域有着丰富的经验。他掌握了很多技术诀窍,这让他几乎可以解决所有技术难题。他还是一位出色的领导者,率领Cake解决方案开发团队,帮助团队解决最棘手的问题。除了醉心于Java和.NET平台外,他还喜欢体育、音乐和夜生活。他与Jan一起负责Cake解决方案的所有主要项目。
Aleksa负责第5、8、10、15、17、21章的撰写。
Anirvan Chakraborty Cake,解决方案的高级开发工程师。由于在Spring框架方面有着丰富的经验并对细节实现有深入了解,他负责实现一些具有挑战性的项目。Anirvan为他的代码感到自豪,始终都确保他的代码能够作为范例示人。除了爱捣弄Java EE和Linux之外,他喜欢跟朋友们一起聚会,享用美食。他还热衷于板球,喜欢阅读侦探小说。
Anirvan负责第7、13、19、20章的撰写。
Jessica Dirt,自2008年初开始成为伦敦Avenue A Razorfish公司的开发人员。在此之前她为Cake解决方案工作了两年半。她主要负责一些企业级项目,所有项目都用到了本书所介绍的Spring框架和SpringWebFlow Jessica掌握了大量的专业知识,擅长使用Lucene获取更高效率的索引,使用Gigaspaces有效地提升JavaEE应用的可扩展性。工作之余,Jessica热衷于排球运动和健身。
Jessica负责第12、18章的撰写。
编辑推荐《Spring高级程序设计》:
Spring框架创始人始倾情推荐的权威开指南,全面揭示Spring框架关键技术,深入了解Spring内部工作机制。
"Spring Framework 2.5的发布反映了Sping框架和企业Java,框架的最新进展。任何勤勉的Java开发者都应该阅读这本开发指南。”
——ProSpring一书作者Rob Ptarrop
作为最强大、应用最广泛的企业级Java开发框架,Spring因其强大的适应性和可扩展性而适用于各种企业级系统。《Spring高级程序设计》是由资深Spring开发专家编写,囊括了Sping开发人员需要了解的精炼要点和复杂主题。基于目前企业中应用最广泛的Spring 2.5版本,不但全面介绍了Spring发框架的关键技术和模块。并且还介绍TAJAX、Web工作流、动态语言等主流技术。
《Spring高级程序设计》适合所有Java开发人员。特别是企业级Java开发人员阅读参考。是一本由Spring框架核心开发人员为读者奉献的权威开发指南,将带给你设计和构建高效、可扩展的Spring应用的丰富知识和经验。
目录
第一部分 Spring入门
第1章 Spring简介2
1.1 Spring是什么2
1.1.1 依赖注入之外的特性4
1.1.2 使用Spring进行面向方面编程4
1.1.3 数据访问5
1.1.4 简化与整合JavaEE5
1.1.5 基于Spring的任务调度6
1.1.6 Spring对邮件的支持6
1.1.7 动态语言6
1.1.8 远程访问6
1.1.9 事务管理7
1.1.10 SpringMVC框架7
1.1.11 SpringWebFlow7
1.1.12 AJAX技术7
1.1.13 国际化8
1.1.14 简化异常处理8
1.2 Spring项目8
1.2.1 Spring的起源8
1.2.2 Spring.NET8
1.2.3 SpringIDE9
1.2.4 Spring安全系统(原Acegi)9
1.2.5 Spring的替代方案9
1.3 示例代码10
1.4 小结10
第2章 Spring入门11
2.1 获取Spring框架11
2.1.1 从CVS上签出Spring11
2.1.2 从源码构建Spring12
2.1.3 检查Spring发布包13
2.1.4 Spring发布包13
2.1.5 Spring依赖的包14
2.1.6 示例应用16
2.1.7 配置Spring和IDE18
2.2 HelloWorld示例20
2.3 Spring版本的“Hello,World”示例23
2.3.1 依赖注入24
2.3.2 Spring的侵入性26
2.4 小结26
第3章 控制反转27
3.1 控制反转和依赖注入27
3.2 控制反转的类型27
3.2.1 上下文依赖查找29
3.2.2 构造方法依赖注入30
3.2.3 设置方法依赖注入31
3.2.4 依赖注入与依赖查找32
3.2.5 设置方法注入与构造方法注入33
3.3 Spring中的控制反转34
3.4 基于Spring的依赖注入34
3.4.1 bean和BeanFactory34
3.4.2 BeanFactory实现35
3.4.3 XMLbean定义36
3.4.4 构造方法注入37
3.4.5 注入参数40
3.4.6 理解bean的命名50
3.4.7 bean的实例化模式52
3.4.8 解析依赖55
3.4.9 bean的自动装配57
3.4.10 依赖检查61
3.4.11 bean的继承62
3.5 小结64
第4章 进阶66
4.1 Spring对应用程序可移植性的影响67
4.2 管理bean的生命周期67
4.2.1 嵌入bean的创建68
4.2.2 嵌入bean的销毁74
4.3 让bean可被Spring感知79
4.3.1 使用BeanNameAware接口80
4.3.2 使用BeanFactoryAware接口81
4.4 使用方法注入(methodinjection)83
4.4.1 查找方法注入83
4.4.2 方法替换88
4.5 使用FactoryBean接口91
4.5.1 MessageDigestFactoryBean类91
4.5.2 直接访问FactoryBean94
4.6 BeanFactoryPostProcessor类94
4.7 JavaBean的属性修改器101
4.7.1 内建的PropertyEditor101
4.7.2 创建自定义PropertyEditor104
4.8 BeanPostProcessor类108
4.8.1 实现一个BeanPostProcessor110
4.8.2 使用BeanPostProcessor类的实机选择114
4.9 SpringApplicationContext115
4.9.1 ApplicationContext的实现类115
4.9.2 使用ApplicationContextAware116
4.9.3 控制bean的初始化117
4.9.4 使用基于注解的配置118
4.9.5 使用MessageSource进行国际化123
4.9.6 在独立应用中使用MessageSource130
4.9.7 MessageSourceResolvable接口130
4.9.8 使用应用程序事件130
4.9.9 对于事件用法的考虑132
4.9.10 访问资源133
4.10 小结134
第5章 SpringAOP基础135
5.1 AOP概念136
5.2 AOP的类型136
5.2.1 静态AOP137
5.2.2 动态AOP137
5.2.3 选择一种AOP类型137
5.3 Spring中的AOP137
5.3.1 AOP联盟138
5.3.2 AOP的HelloWorld138
5.3.3 SpringAOP架构140
5.3.4 ProxyFactory类140
5.3.5 在Spring中创建通知141
5.4 Spring里的通知者和切入点155
5.4.1 切入点接口156
5.4.2 使用ComposablePointcut172
5.4.3 切入点总结175
5.5 代理详解176
5.5.1 理解代理176
5.5.2 使用JDK动态代理176
5.5.3 使用CGLIB代理177
5.5.4 两者的性能比较177
5.5.5 选用代理180
5.6 小结180
第6章 AOP进阶182
6.1 @AspectJ注解182
6.2 @AspectJ方面详解186
6.2.1 切入点186
6.2.2 切入点表达式189
6.2.3 探讨切入点表达式191
6.2.4 在XML中使用@Pointcuts194
6.2.5 通知的类型194
6.2.6 参数绑定201
6.2.7 引入202
6.2.8 方面的生命周期208
6.3 AOP的框架服务209
6.3.1 使用AOP命名空间创建第一个方面209
6.3.2 AOP命名空间中的切入点211
6.3.3 使用AOP命名空间创建通知212
6.3.4 AOP命名空间中的引入217
6.4 风格选择219
6.5 使用SpringAOP代理220
6.6 AspectJ集成225
6.6.1 创建第一个AspectJ方面225
6.6.2 编译示例程序227
6.6.3 AspectJ方面的作用域229
6.7 加载时织入230
6.7.1 第一个加载时织入示例230
6.7.2 LoadTimeWeaver的查找策略232
6.8 AOP实践232
6.9 小结235
第7章 Springschema与命名空间236
7.1 新配置的缘由236
7.2 Spring2.5包含的schema238
7.2.1 beansschema238
7.2.2 上下文schema239
7.2.3 utilschema239
7.2.4 txschema242
7.2.5 aopschema242
7.2.6 jeeschema242
7.2.7 langschema243
7.3 schema背后244
7.4 自定义schema246
7.5 IDE配置249
7.6 小结252
第8章 Spring模式253
8.1 目录结构253
8.1.1 简单应用253
8.1.2 复杂应用255
8.1.3 打包和命名255
8.2 设计模式简介255
8.2.1 面向接口编程256
8.2.2 创建模式256
8.2.3 结构模式260
8.2.4 行为模式262
8.3 Spring应用模式264
8.3.1 分层设计265
8.3.2 高性能分页266
8.3.3 多错误报告268
8.3.4 用户界面事务271
8.3.5 后台进程274
8.3.6 邮件通知278
8.3.7 错误收集和日志280
8.4 小结283
第二部分 数据访问
第9章 Spring对JDBC的支持286
9.1 JDBC的主要概念286
9.1.1 使用DriverManager和Connection288
9.1.2 使用PreparedStatement289
9.1.3 使用CallableStatement类292
9.1.4 其他JDBC概念293
9.2 Spring对数据访问支持的概念293
9.3 Spring对JDBC数据访问的支持294
9.4 使用JdbcTemplate类294
9.4.1 JdbcTemplate类的execute方法296
9.4.2 JdbcTemplate类的query方法和该方法的扩展299
9.4.3 JdbcTemplat类的update方法303
9.4.4 JdbcTemplate类的batchUpdate方法304
9.5 RdbmsOperation子类305
9.5.1 SqlUpdate子类306
9.5.2 BatchSqlUpdate子类311
9.5.3 SqlCall类和StoredProcedure子类312
9.5.4 SqlQuery类和它的子类314
9.5.5 JdbcTemplate类和RdbmsOperation类的比较321
9.6 大二进制对象321
9.7 JdbcDaoSupport类324
9.8 简单的SpringJDBC326
9.8.1 SimpleJdbcTemplate类326
9.8.2 SimpleJdbcCall类329
9.8.3 SimpleJdbcInsert类331
9.8.4 SimpleJdbcDaoSupport类332
9.9 小结333
第10章 集成iBATIS334
10.1 iBATIS简述334
10.1.1 iBATIS版本334
10.1.2 基础架构和配置335
10.2 映射文件335
10.2.1 sqlMap文件337
10.2.2 配置iBATIS和Spring339
10.3 查询数据341
10.3.1 简单查询操作341
10.3.2 一对一查询操作344
10.3.3 一对多查询操作348
10.3.4 多对多查询操作350
10.4 更新数据350
10.5 删除数据353
10.6 插入数据354
10.7 iBATIS缺少的特性356
10.8 整体性能357
10.9 小结358
第11章 Spring对Hibernate的支持..359
11.1 Hibernate入门359
11.2 Hibernate打包360
11.3 Hibernate支持的介绍361
11.3.1 使用HibernateSession363
11.3.2 使用HibernateDaoSupport类366
11.3.3 HibernateTemplate和Session间的选择368
11.4 在企业级应用程序中使用Hibernate372
11.4.1 阻止更新脏数据372
11.4.2 对象等价性375
11.4.3 事务支持378
11.4.4 延迟加载382
11.5 处理大数据集392
11.6 处理大对象394
11.7 使用Hibernate处理其他DAO代码397
11.8 小结398
第三部分 企业级应用组件
第12章 基于Spring的任务调度400
12.1 使用JDKTimer调度任务401
12.1.1 Timer触发器类型401
12.1.2 创建一个简单任务401
12.1.3 Spring对JDKTimer调度的支持404
12.2 使用OpenSymphonyQuartz来调度任务409
12.2.1 Quartz简介410
12.2.2 Spring对Quartz的支持418
12.3 任务调度时需考虑的因素423
12.3.1 选择一个调度器423
12.3.2 剥离Job类中的任务逻辑424
12.3.3 任务执行和线程池424
12.4 小结428
第13章 Spring的邮件支持429
13.1 SpringMailAPI结构430
13.2 发送简单的电子邮件430
13.2.1 编程式构造和发送电子邮件431
13.2.2 声明式构造电子邮件433
13.3 构造并发送MIME消息436
13.3.1 发送基本的HTML消息438
13.3.2 发送带有内嵌图片的HTML消息439
13.3.3 发送带有附件的消息441
13.3.4 发送带有可替换纯文本的HTML消息442
13.3.5 发送复杂MIME消息445
13.4 深入了解企业级电子邮件处理449
13.5 小结458
第14章 动态语言459
14.1 支持的动态语言概览459
14.1.1 BeanShell459
14.1.2 Groovy461
14.1.3 JRuby462
14.2 使用动态语言定义Springbean463
14.2.1 动态语言支持的幕后465
14.2.2 代理动态语言bean466
14.2.3 性能466
14.3 可刷新bean(refreshablebean)468
14.4 基于BeanShell的bean470
14.5 基于JRuby的bean472
14.6 基于Groovy的bean473
14.7 动态语言在Spring程序中的典型应用473
14.8 小结477
第四部分 JavaEE5应用开发
第15章 Spring远程访问480
15.1 SpringRemoting架构481
15.2 远程方法调用482
15.2.1 开放任意的服务482
15.2.2 通过代理访问RMI服务484
15.2.3 开放CORBA服务486
15.2.4 访问CORBA服务488
15.3 使用JAX-RPC实现Web服务490
15.3.1 ApacheAxis简介490
15.3.2 使用ServletEndpointSupport创建Web服务490
15.3.3 使用代理访问RPC风格的Web服务494
15.3.4 与Axis服务的JavaBean交互497
15.4 使用JAX-WSWeb服务500
15.4.1 通过SimpleJaxWsServiceExporter公开Web服务501
15.4.2 使用XFire公开Web服务501
15.4.3 访问JAX-WSWeb服务503
15.4.4 从其他客户端访问JavaWeb服务504
15.5 使用HTTPInvoker创建Web服务507
15.5.1 开发简单服务508
15.5.2 通过代理访问HTTPInvoker服务510
15.5.3 在HTTPInvoker服务中使用任意对象511
15.5.4 使用HTTP基本认证513
15.6 远程架构的选择516
15.7 小结517
第16章 事务管理518
16.1 Spring事务抽象层简介518
16.2 分析事务属性519
16.2.1 探索TransactionDefinition接口519
16.2.2 使用TransactionStatus接口520
16.2.3 PlatformTransactionManager的实现521
16.3 对一个事务管理示例的探索521
16.4 编程式事务管理529
16.4.1 使用TransactionTemplate类531
16.4.2 编程式事务管理小结532
16.5 声明性事务管理532
16.5.1 使用TransactionProxyFactoryBean532
16.5.2 在事务管理中使用代理的含义534
16.6 AOP事务管理535
16.6.1 使用基于注解的AOP事务管理535
16.6.2 使用XMLAOP事务管理537
16.6.3 tx:advice标签简介538
16.6.4 XMLAOP小结539
16.7 在多个事务性资源上使用事务540
16.8 实现你自己的事务同步541
16.9 小结548
第17章 基于SpringMVC的Web应用开发549
17.1 MVC架构549
17.2 SpringMVC介绍550
17.3 使用处理器映射551
17.4 Spring控制器553
17.4.1 AbstractController类554
17.4.2 ParameterizableViewController类555
17.4.3 MultiActionController类555
17.5 拦截器558
17.6 视图.本地化和主题559
17.6.1 以编程的方式使用视图559
17.6.2 使用视图解析器561
17.6.3 使用本地化消息565
17.6.4 使用Locale565
17.6.5 使用主题565
17.7 命令控制器567
17.7.1 使用表单控制器568
17.7.2 探索AbstractWizardFormController类574
17.7.3 文件上传578
17.8 处理异常581
17.9 Spring与其他Web技术583
17.9.1 使用JSP583
17.9.2 使用Velocity600
17.9.3 FreeMarker604
17.9.4 使用XSLT视图608
17.9.5 使用PDF视图609
17.9.6 实现PDF视图610
17.9.7 使用Excel视图611
17.9.8 使用Tiles613
17.9.9 JasperReports报表引擎623
17.10 Spring的约定优于配置627
17.10.1 控制器约定628
17.10.2 MultiActionController约定628
17.10.3 模型约定629
17.10.4 视图约定630
17.11 使用注解配置控制器631
17.11.1 @Controller注解631
17.11.2 @RequestMapping注解632
17.11.3 @RequestParam注解633
17.11.4 @ModelAttribute注解633
17.11.5 使用注解配置命令控制器634
17.12 小结635
第18章 SpringWebFlow636
18.1 SpringWebFlow简介637
18.1.1 核心概念637
18.1.2 获取SpringWebFlow640
18.1.3 SpringWebFlow依赖642
18.2 Hello,WebFlow!642
18.3 探索状态646
18.3.1 view状态647
18.3.2 decision状态647
18.3.3 end状态648
18.4 处理转换648
18.5 高级概念650
18.5.1 表达式语言和范围650
18.5.2 实现action653
18.5.3 模型数据绑定654
18.5.4 局部视图刷新658
18.5.5 映射流的输入与输出参数658
18.5.6 使用子流659
18.6 幕后的SpringWebFlow660
18.6.1 流执行架构660
18.6.2 流执行者662
18.6.3 流定义注册表662
18.6.4 流执行仓库665
18.7 集成SpringMVC666
18.7.1 流处理666
18.7.2 视图解析667
18.8 使用SpringSecurity构建安全的流668
18.8.1 第一步:添加SecurityFlow-ExecutionListener668
18.8.2 第二步:处理基本的认证和授权668
18.8.3 第三步:在流定义中定义安全规则670
18.9 问题解决672
18.9.1 带状态的导航控制672
18.9.2 浏览器导航栏支持和双提交(doublesubmit)672
18.10 测试流定义673
18.11 小结674
第19章 Spring与AJAX675
19.1 DWR675
19.2 安装DWR676
19.3 针对DWR的Spring配置676
19.4 关于完整示例677
19.5 测试DWR配置682
19.6 运行完整示例682
19.7 DWR脚本基础683
19.7.1 使用简单的回调函数683
19.7.2 调用元数据对象684
19.8 engine.js文件684
19.8.1 调用批处理684
19.8.2 调用顺序684
19.8.3 错误和警告处理684
19.9 util.js脚本685
19.10 DWR的安全性685
19.11 DWR的优缺点686
19.12 小结687
第20章 使用SpringJMX688
20.1 JMX进阶688
20.2 开放JavaBean689
20.2.1 MBeanExporter类689
20.2.2 MBeanServerFactoryBean类691
20.2.3 在已有的MBean服务器上开放Bean692
20.2.4 Bean注册行为692
20.3 控制对象名693
20.4 控制管理接口693
20.4.1 MBeanInfoAssembler接口693
20.4.2 MethodNameBasedMBean-InfoAssembler接口694
20.4.3 用Java接口来控制管理接口696
20.4.4 使用源码级元数据698
20.5 远程使用SpringJMX701
20.5.1 开放远程MBean701
20.5.2 访问远程MBean702
20.5.3 代理MBean702
20.6 SpringJMX通知703
20.6.1 通知监听器703
20.6.2 发布通知704
20.7 小结708
第21章 使用Spring进行测试709
21.1 进行单元测试709
21.2 单元测试711
21.3 集成测试715
21.3.1 使用AbstractSpring-ContextTests722
21.3.2 使用AbstractDependency-InjectionSpringContext-Tests类723
21.3.3 使用AbstractTransac-tionalSpringContextTest726
21.3.4 使用AbstractAnnotation-AwareTransactionalTest728
21.3.5 JNDI731
21.4 SpringTestContextFramework733
21.4.1 应用上下文及使用TestContextFramework进行依赖注入733
21.4.2 使用TestContextFramework进行依赖注入735
21.4.3 TestContextFramework中的事务736
21.4.4 支持类738
21.5 测试覆盖740
21.6 小结740
第22章 Spring性能调优741
22.1 性能与响应741
22.2 探索企业应用的性能问题741
22.3 测量JavaEE应用的性能742
22.3.1 测量目标742
22.3.2 确定必要的数据集747
22.3.3 改善数据访问层748
22.3.4 提高事务管理757
22.3.5 控制远程调用的性能758
……[看更多目录]
序言最近,Java业界发生了巨变,从如EJB(Enterprise JavaBean)的“重量级”架构体系向如ISpring的轻量级框架迁移。Hibernate和AOP(面向方面编程)等更简单的实现机制代替了复杂并且依赖容器的服务(如CMP)和事务管理系统。Spring核心层提供了一个完善的基于控制反转(IOC)的轻量级容器,用户可以使用它建立自己的应用程序。在容器上,Spring提供了大量实用的服务,将很多高质量开源项目集成到统一的框架上。
Spring框架的品质已经显现,它在很多应用中已经取代了传统的JavaEE架构。因此,越来越多的开发者认识到需要对Spring技术有一个全面的了解。尽管Spring有着相当丰富的文档资源和案例,但我们还是发现,仍然有许多开发者为了解如何使用Spring,特别是如何有效地运用Spring而苦苦探究。因此,我们决定为Pro Spring写一个新版本。
文摘插图:
第1章 Spring简介
当提到Java开发者社区时,我们总会想到19世纪40年代后期大批的淘金者在北美河流寻找黄金的情景。作为Java开发人员,我们的河流充满了开源的项目。但是像寻宝一样,找到一个有用的开源项目是一项艰巨且耗时的工作。尽管如此,仍有越来越多的开发者转向了开源工具和代码。开放源码在使用上带来了创新,同时其限制又少,让开发人员更专注于核心应用的构建。
许多Java开源项目的通病是仅为了实现最热门的技术或模式。另外一个问题是有些项目已经失去了发展的动力,比如某些项目的0.1版本看上去很有前景,但是却始终没有推出0.2版,更不用说1.0版了。话虽如此,但还是有很多高质量、对用户友好的项目,满足了实际应用的需要。本书为大家精心挑选了这些项目的一个子集,其一个特别棒的就是Spring框架。
自Rod Johnson的Expert One-to-One J2EEDesign and Development一书(Wrox,2002年10月出版)中展示Spring代码的雏形开始,世界上很多知名的Java开发人员都为Spring贡献了代码,最新的版本是2.5版。
在本书中,大家会看到使用各种开源技术的应用,所有技术都统一在Spring框架上。利用Spring,应用开发人员可以使用各种各样的开源工具,而不需要写繁琐的基础代码,并且能大大降低应用与特定工具的耦合性。本章将对Spring框架进行简单介绍,若读者已经对Spring相当熟悉了,可以跳过本章直接阅读第2章,第2章介绍了安装和使用Spring完成经典的“Hello,World”应用。
我们的主要目的是尽力为读者提供Spring框架的全面参考,同时我们会提供大量实际的、针对应用的建议,而决不是克隆出来一本Spring框架文档。为了做到这一点,我们建立了一个使用Spring的完整应用示例,帮助读者更好地了解Spring框架的使用方法。