测试驱动开发方法可提升整体游戏开发速度

我们刚刚实现了完全用测试驱动开发(注:Test Driven Development,下文简称“TDD”)方法制作完成首款游戏。我将在下文中分享我的经验,现在我们已经彻底完成了项目的首个版本。我之前讨论过测试驱动游戏开发方法(注:下文简称“TDGD”),但是大部分是理论内容。所以,今天我想要分享的是TDGD如何有助于完成《Battle Group》的制作。

  battle group

  测试驱动游戏开发方法

  测试驱动游戏开发方法背后的理念是,编写自动化单元测试来确认产品代码的正确与否。单元测试可以用来测试游戏的所有层面,从游戏玩法到渲染引擎及其他的内容。正如我之前所说的那样,TDGD有3个主要目标:

  1、找到破坏性代码。如果你变更的代码会破坏某些之前已经能够运转的东西,你马上就会察觉到。

  2、促成代码模块化。要使代码能够进行“单元测试”,就必须将其模块化,不同系统间有着清晰的边界。

  3、让你“找到趣味性”。确保满足某些要求之后,你可以自由地改良游戏玩法,使之更具娱乐性,同时不会破坏整个游戏。这也会让设计师在编写脚本时更加自由。鼓励设计师脱离程序员来开展游戏玩法试验,这种做法的好处是不可估量的。

  方法步骤

  通常情况下,新游戏玩法功能的开发需遵循以下步骤:

  1、为新功能设计单元测试,测试系统其他部分可见的外部界面

  2、尽快执行功能,根据需要消除部分内容,这样才能够尽快地让该功能生效

  3、团队对功能进行测试,确保其能够运转且有趣,我们通过重复测试来改良这个功能

  4、对功能感到满意后,我会折回代码,清理所有捷径,使之成为最优化解决方案

  这个系统极为有效,使新功能制作以及现有功能的维护和更新能够在短时间内完成。

  游戏玩法测试

  为《Battle Group》创建的所有单元测试的目标都是测试游戏玩法代码,因为这是我们游戏中最复杂的部分。Unity帮助实现了多数基于技术的系统(注:比如渲染和输入),这使得我们项目中将近90%的代码的直接关联对象是游戏玩法。进行这种测试的主要动机在于,让我们可以迅速开发功能和用现有代码开展试验,同时不破坏现有的系统。在项目的整个开发过程中,多数情况下我们都能够实现这个目标。在4个月的开发周期中,虽然游戏玩法几乎仍保持不变,但是我们对其进行了多次较大的改动,而单元测试在这些改动过程中表现出不可估量的价值。

  和多数游戏一样,《Battle Group》的开发从游戏设计文件开始。随后,我们制作了游戏原型,修改设计文件,开始构建测试版本。这份设计文件转化成了单元测试。我是项目的程序员,虽然这项工作应该由我来负责,但是我计划将来让游戏设计师来负责编写针对游戏玩法的单元测试。随着项目的进展,游戏的设计结构从静态的设计文件转变成动态的一整套单元测试。随后,团队提出改变设计的需求,我就将时间放在更新单元测试以配合新设计。

  Test Driven Game Development

  构建原型

  在项目原型构建阶段(注:作者的团队在这个时期大约耗费1周的工作时间),我们并没有创建这些单元测试,因为这是个之前被遗弃的原型,单元测试只会放慢我们的开发速度,而且没有多大的价值。TDGD有个弱点,就是在对代码库进行重大改变时会影响到开发速度。而在原型构建阶段经常需要改动代码库,因而我不推荐在开发原型阶段使用TDGD,尤其是之前被遗弃的原型。

  但是,原型阶段是开始充实测试设计的绝妙时机。因为你正在处理的是游戏核心功能,所以你可以看到主要的代码编写精力要放在哪里,而且也能了解到哪些区域在项目的开发过程中最容易发生改变。《Battle Group》中的爆炸半径和武器速度便是绝佳的例证。这些方面的小改动会对游戏的感觉、流程和易用性产生很大的影响。出于这个原因,我采取措施确保这些部分既能够很容易地更改又能够在更改后保持稳定。随着速度增加,每帧的移动距离也会变大。老式移动设备的物理帧率较低,所以对变化的帧率和数据值进行重复性测试就变得至关重要。因为我已经计划在原型构建后执行TDGD,所以我会特别注意这些区域的代码,有意对这些区域进行彻底的测试。

  代码覆盖范围

  无论何时,当我同游戏开发行业内外的人谈论起TDD时,往往会就代码覆盖方面展开激辩。代码覆盖指单元测试所“覆盖”的产品代码比例。有人认为,如果代码覆盖没有达到100%的话,就不能算是真正使用TDD,也有人认为覆盖比例只要满足需求即可。我的观点是,代码覆盖应当由游戏/代码本身来决定。有时候,某些测试带来的麻烦要多于好处(注:比如,修改几行代码需要更新10倍行数的单元测试代码)。对于这种情况,要么重新考虑执行的测试方式,要么完全取消此类测试。

  对于《Battle Group》的代码覆盖,我追求的是实际效果。我的主要关注点是,利用我有限的资源获得最好的效果,因为我是团队中唯一的程序员。在原型构建和整个项目开发期间,我注意哪些区域的代码比较关键或经常被破坏,尽量给它们提供最高的代码覆盖范围。

  测试优先开发方式

  我选择“测试优先”开发方式,创建我的单元测试,然后执行需要测试的功能。这使我可以根据代码应有的用途进行设计,而不是根据问题来编写解决方案。我发现,这可以保持关注点的独立性,确保所有东西都能够尽可能地模块化。优先思考功能性的外部界面,这有助于我进入制作自己所需内容的思想状态。在解决某个有趣和复杂的问题时,我们很容易遗忘原本的代码存在目的。测试优先开发方法可以助你将精力放在最需要的地方,确定随后执行代码片段的功能性。

  NCrunch

  在《Battle Group》开发期间,NCrunch工具发布。这个工具会完全改变你的单位测试方法。我无法在此阐述更多细节内容,但是我强烈推荐你获取和试用这个工具。整个系统可以概括成两点:

  1、单元测试代码含有即时内联红绿灯,显示当前状态能否通过测试。测试保持在后台的运行,持续更新状态。

  2、产品代码有个类似的红绿灯系统,显示覆盖这段代码的测试通过和失败情况。

  结论

  从总体上说,我对TDGD给《Battle Group》开发带来的帮助很满意,我计划在未来项目中继续使用这种方法。尽管在执行某些新功能时会略微减慢,但整体开发速度获得了提升。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。   Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升应用开发的优雅性。   《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。此外,本书重点突出了“实战性”的主题,力求使全书“从实际项目中来,到实际项目中去”。 目录 第1篇 概述 第1章 Spring概述 1.1 认识Spring 1.2 关于SpringSource 1.3 Spring带给我们什么 1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 Web层的增强 1.5.7 其他 1.6 Spring对Java版本的要求 1.7 如何获取Spring 1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖关系的注入 3.2 相关Java基础知识 3.2.1 简单实例 3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 BeanFactory中Bean的生命周期 3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂方法注入 4.3.4 选择注入方式的考量 4.4 注入参数详解 4.4.1 字面值 4.4.2 引用其他Bean 4.4.3 内部Bean 4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型属性 4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 <bean>之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 prototype作用域 4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean 4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition 5.1.3 InstantiationStrategy 5.1.4 BeanWrapper 5.2 属性编辑器 5.2.1 JavaBean的编辑器 5.2.2 Spring默认属性编辑器 5.2.3 自定义属性编辑器 5.3 使用外部属性文件 5.3.1 使用外部属性文件 5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring事件类结构 5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强 6.3.4 环绕增强 6.3.5 异常抛出增强 6.3.6 引介增强 6.4 创建切面 6.4.1 切点类型 6.4.2 切面类型 6.4.3 静态普通方法名匹配切面 6.4.4 静态正则表达式方法匹配切面 6.4.5 动态切面 6.4.6 流程切面 6.4.7 复合切点切面 6.4.8 引介切面 6.5 自动创建代理 6.5.1 实现类介绍 6.5.2 BeanNameAutoProxyCreator 6.5.3 DefaultAdvisorAutoProxyCreator 6.6 小结 第7章 基于@AspectJ和Schema的AOP 7.1 Spring对AOP的支持 7.2 JDK 5.0注解知识快速进阶 7.2.1 了解注解 7.2.2 一个简单的注解类 7.2.3 使用注解 7.2.4 访问注解 7.3 着手使用@AspectJ 7.3.1 使用前的准备 7.3.2 一个简单的例子 7.3.3 如何通过配置使用@AspectJ切面 7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 7.5.1 @annotation() 7.5.2 execution() 7.5.3 args()和@args() 7.5.4 within() 7.5.5 @within()和@target() 7.5.6 target()的this() 7.6 @AspectJ进阶 7.6.1 切点复合运算 7.6.2 命名切点 7.6.3 增强织入的顺序 7.6.4 访问连接点信息 7.6.5 绑定连接点方法入参 7.6.6 绑定代理对象 7.6.7 绑定类注解对象 7.6.8 绑定返回值 7.6.9 绑定抛出的异常 7.7 基于Schema配置切面 7.7.1 一个简单切面的配置 7.7.2 配置命名切点 7.7.3 各种增强类型的配置 7.7.4 绑定连接点信息 7.7.5 Advisor配置 7.8 混合切面类型 7.8.1 混合使用各种切面类型 7.8.2 各种切面类型总结 7.9 JVM Class文件字节码转换基础知识 7.9.1 java.lang.instrument包的工作原理 7.9.2 如何向JVM中注册转换器 7.9.3 使用JVM启动参数注册转换器的问题 7.10 使用LTW织入切面 7.10.1 Spring的LoadTimeWeaver 7.10.2 使用LTW织入一个切面 7.10.3 在Tomcat下的配置 7.10.4 在其他Web应用服务器下的配置 7.11 小结 第3篇 数据访问 第8章 Spring对DAO的支持 8.1 Spring的DAO理念 8.2 统一的异常体系 8.2.1 Spring的DAO异常体系 8.2.2 JDBC的异常转换器 8.2.3 其他持久技术的异常转换器 8.3 统一数据访问模板 8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 9.1.2 数据并发的问题 9.1.3 数据库锁机制 9.1.4 事务隔离级别 9.1.5 JDBC对事务支持 9.2 ThreadLocal基础知识 9.2.1 ThreadLocal是什么 9.2.2 ThreadLocal的接口方法 9.2.3 一个TheadLocal实例 9.2.4 与Thread同步机制的比较 9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML配置声明式事务 9.5.1 一个将被实施事务增强的服务接口 9.5.2 使用原始的 TransactionProxyFactoryBean 9.5.3 基于tx/aop命名空间的配置 9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 DAO和事务管理的牵绊 10.1.1 JDBC访问数据库 10.1.2 Hibernate访问数据库 10.2 应用分层的迷惑 10.3 事务方法嵌套调用的迷茫 10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套的服务方法 10.4 多线程的困惑 10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过DataSourceUtils获取数据连接 10.7.5 JdbcTemplate如何做到对连接泄漏的免疫 10.7.6 使用TransactionAwareDataSourceProxy 10.7.7 其他数据访问技术的等价类 10.8 小结 第11章 使用Spring JDBC访问数据库 11.1 使用Spring JDBC 11.1.1 JDBCTemplate小试牛刀 11.1.2 在DAO中使用JDBCTemplate 11.2 基本的数据操作 11.2.1 更改数据 11.2.2 返回数据库的表自增主键值 11.2.3 批量更改数据 11.2.4 查询数据 11.2.5 查询单值数据 11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入Lob类型的数据 11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和行集 11.4.1 自增键的使用 11.4.2 如何规划主键方案 11.4.3 以行集返回数据 11.5 其他类型的JDBCTemplate 11.5.1 NamedParameterJDBCTemplate 11.5.2 SimpleJDBCTemplate 11.6 以OO方式访问数据库 11.6.1 使用MappingSqlQuery查询数据 11.6.2 使用SqlUpdate更新数据 11.6.3 使用StoredProcedure执行存储过程 11.6.4 SqlFunction类 11.7 小结 第12章 整合其他ORM框架 12.1 Spring整合ORM技术 12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate 12.2.3 处理LOB类型数据 12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis 12.3.3 编写myBatis的DAO 12.5 DAO层设计 12.5.1 DAO基类的设计 12.5.2 查询接口方法的设计 12.5.3 分页查询接口设计 12.6 小结 第4篇 业务层及Web层技术 第13章 任务调度和异步执行器 13.1 任务调度概述 13.2 Quartz快速进阶 13.2.1 Quartz基础结构 13.2.2 使用SimpleTrigger 13.2.3 使用CronTrigger 13.2.4 使用Calendar 13.2.5 任务调度信息存储 13.3 在Spring中使用Quartz 13.3.1 创建JobDetail 13.3.2 创建Trigger 13.3.3 创建Scheduler 13.4 Spring中使用JDK Timer 13.4.1 Timer和TimerTask 13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用程序集群的影响 13.6.3 任务调度云 13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速入门 14.2.3 使用XStream别名 14.2.4 XStream转换器 14.2.5 XStream注解 14.2.6 流化对象 14.2.7 持久化API 14.2.8 额外功能:处理JSON 14.3 其他常见O/X Mapping开源项目 14.3.1 JAXB 14.3.2 XMLBeans 14.3.3 Castor 14.3.4 JiBX 14.3.5 总结比较 14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小结 第15章 Spring MVC 15.1 Spring MVC概述 15.1.1 体系结构 15.1.2 配置DispatcherServlet 15.1.3 一个简单的实例 15.2 注解驱动的控制器 15.2.1 使用@RequestMapping映射请求 15.2.2 请求处理方法签名概述 15.2.3 处理方法签名详细说明 15.2.4 使用HttpMessageConverter<T> 15.2.5 处理模型数据 15.3 处理方法的数据绑定 15.3.1 数据绑定流程剖析 15.3.2 数据转换 15.3.3 数据格式化 15.3.4 数据校验 15.4 视图和视图解析器 15.4.1 认识视图 15.4.2 认识视图解析器 15.4.3 JSP和JSTL 15.4.4 模板视图 15.4.5 Excel 15.4.6 PDF 15.4.7 输出XML 15.4.8 输出JSON 15.4.9 使用XmlViewResolver 15.4.10 使用ResourceBundle ViewResolver 15.4.11 混合使用多种视图技术 15.5 本地化解析 15.5.1 本地化概述 15.5.2 使用CookieLocaleResolver 15.5.3 使用SessionLocaleResolver 15.5.4 使用LocaleChangeInterceptor 15.6 文件上传 15.6.1 配置MultipartResolver 15.6.2 编写控制器和文件上传表单页面 15.7 杂项 15.7.1 静态资源处理 15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 16.2.3 使用JUnit 16.3 模拟利器Mockito 16.3.1 模拟测试概述 16.3.2 创建Mock对象 16.3.3 设定Mock对象的期望行为及返回值 16.3.4 验证交互行为 16.4 测试整合之王Unitils 16.4.1 Unitils概述 16.4.2 集成Spring 16.4.3 集成Hibernate 16.4.4 集成Dbunit 16.4.5 自定义扩展模块 16.5 使用Unitils测试DAO层 16.5.1 数据库测试的难点 16.5.2 扩展Dbunit用Excel准备数据 16.5.3 测试实战 16.6 使用unitils测试Service层 16.7 测试Web层 16.7.1 对LoginController进行单元测试 16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要功能流程描述 17.2 系统设计 17.2.1 技术框架选择 17.2.2 Web目录结构及类包结构规划 17.2.3 单元测试类包结构规划 17.2.4 系统的结构图 17.2.5 PO的类设计 17.2.6 持久层设计 17.2.7 服务层设计 17.2.8 Web层设计 17.2.9 数据库设计 17.3 开发前的准备 17.4 持久层开发 17.4.1 PO类 17.4.2 DAO基类 17.4.3 通过扩展基类所定义DAO类 17.4.4 DAO Bean的装配 17.4.5 使用Hibernate二级缓存 17.5 对持久层进行测试 17.5.1 配置Unitils测试环境 17.5.2 准备测试数据库及测试数据 17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的开发 17.6.2 ForumService的开发 17.6.3 服务类Bean的装配 17.7 对服务层进行测试 17.7.1 编写Service测试基类 17.7.2 编写ForumService测试用例 17.8 Web层开发 17.8.1 BaseController的基类 17.8.2 用户登录和注销 17.8.3 用户注册 17.8.4 论坛管理 17.8.5 论坛普通功能 17.8.6 分页显示论坛版块的主题帖子 17.8.7 web.xml配置 17.8.8 Spring MVC配置 17.9 对Web层进行测试 17.9.1 编写Web测试基类 17.9.2 编写ForumManageController测试用例 17.10 部署和运行应用 17.11 小结 以下内容详见本书配书光盘: 附录A JavaMail发送邮件 附录B 在Spring中开发Web Service
 Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。   Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升应用开发的优雅性。   《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。此外,本书重点突出了“实战性”的主题,力求使全书“从实际项目中来,到实际项目中去”。 目录 第1篇 概述 第1章 Spring概述 1.1 认识Spring 1.2 关于SpringSource 1.3 Spring带给我们什么 1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 Web层的增强 1.5.7 其他 1.6 Spring对Java版本的要求 1.7 如何获取Spring 1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖关系的注入 3.2 相关Java基础知识 3.2.1 简单实例 3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 3.5 Bean的生命周期 3.5.1 BeanFactory中Bean的生命周期 3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 依赖注入 4.3.1 属性注入 4.3.2 构造函数注入 4.3.3 工厂方法注入 4.3.4 选择注入方式的考量 4.4 注入参数详解 4.4.1 字面值 4.4.2 引用其他Bean 4.4.3 内部Bean 4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型属性 4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 <bean>之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 4.8 Bean作用域 4.8.1 singleton作用域 4.8.2 prototype作用域 4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean 4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition 5.1.3 InstantiationStrategy 5.1.4 BeanWrapper 5.2 属性编辑器 5.2.1 JavaBean的编辑器 5.2.2 Spring默认属性编辑器 5.2.3 自定义属性编辑器 5.3 使用外部属性文件 5.3.1 使用外部属性文件 5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring事件类结构 5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强 6.3.4 环绕增强 6.3.5 异常抛出增强 6.3.6 引介增强 6.4 创建切面 6.4.1 切点类型 6.4.2 切面类型 6.4.3 静态普通方法名匹配切面 6.4.4 静态正则表达式方法匹配切面 6.4.5 动态切面 6.4.6 流程切面 6.4.7 复合切点切面 6.4.8 引介切面 6.5 自动创建代理 6.5.1 实现类介绍 6.5.2 BeanNameAutoProxyCreator 6.5.3 DefaultAdvisorAutoProxyCreator 6.6 小结 第7章 基于@AspectJ和Schema的AOP 7.1 Spring对AOP的支持 7.2 JDK 5.0注解知识快速进阶 7.2.1 了解注解 7.2.2 一个简单的注解类 7.2.3 使用注解 7.2.4 访问注解 7.3 着手使用@AspectJ 7.3.1 使用前的准备 7.3.2 一个简单的例子 7.3.3 如何通过配置使用@AspectJ切面 7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 7.5.1 @annotation() 7.5.2 execution() 7.5.3 args()和@args() 7.5.4 within() 7.5.5 @within()和@target() 7.5.6 target()的this() 7.6 @AspectJ进阶 7.6.1 切点复合运算 7.6.2 命名切点 7.6.3 增强织入的顺序 7.6.4 访问连接点信息 7.6.5 绑定连接点方法入参 7.6.6 绑定代理对象 7.6.7 绑定类注解对象 7.6.8 绑定返回值 7.6.9 绑定抛出的异常 7.7 基于Schema配置切面 7.7.1 一个简单切面的配置 7.7.2 配置命名切点 7.7.3 各种增强类型的配置 7.7.4 绑定连接点信息 7.7.5 Advisor配置 7.8 混合切面类型 7.8.1 混合使用各种切面类型 7.8.2 各种切面类型总结 7.9 JVM Class文件字节码转换基础知识 7.9.1 java.lang.instrument包的工作原理 7.9.2 如何向JVM中注册转换器 7.9.3 使用JVM启动参数注册转换器的问题 7.10 使用LTW织入切面 7.10.1 Spring的LoadTimeWeaver 7.10.2 使用LTW织入一个切面 7.10.3 在Tomcat下的配置 7.10.4 在其他Web应用服务器下的配置 7.11 小结 第3篇 数据访问 第8章 Spring对DAO的支持 8.1 Spring的DAO理念 8.2 统一的异常体系 8.2.1 Spring的DAO异常体系 8.2.2 JDBC的异常转换器 8.2.3 其他持久技术的异常转换器 8.3 统一数据访问模板 8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 9.1.2 数据并发的问题 9.1.3 数据库锁机制 9.1.4 事务隔离级别 9.1.5 JDBC对事务支持 9.2 ThreadLocal基础知识 9.2.1 ThreadLocal是什么 9.2.2 ThreadLocal的接口方法 9.2.3 一个TheadLocal实例 9.2.4 与Thread同步机制的比较 9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML配置声明式事务 9.5.1 一个将被实施事务增强的服务接口 9.5.2 使用原始的 TransactionProxyFactoryBean 9.5.3 基于tx/aop命名空间的配置 9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 DAO和事务管理的牵绊 10.1.1 JDBC访问数据库 10.1.2 Hibernate访问数据库 10.2 应用分层的迷惑 10.3 事务方法嵌套调用的迷茫 10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套的服务方法 10.4 多线程的困惑 10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过DataSourceUtils获取数据连接 10.7.5 JdbcTemplate如何做到对连接泄漏的免疫 10.7.6 使用TransactionAwareDataSourceProxy 10.7.7 其他数据访问技术的等价类 10.8 小结 第11章 使用Spring JDBC访问数据库 11.1 使用Spring JDBC 11.1.1 JDBCTemplate小试牛刀 11.1.2 在DAO中使用JDBCTemplate 11.2 基本的数据操作 11.2.1 更改数据 11.2.2 返回数据库的表自增主键值 11.2.3 批量更改数据 11.2.4 查询数据 11.2.5 查询单值数据 11.2.6 调用存储过程 11.3 BLOB/CLOB类型数据的操作 11.3.1 如何获取本地数据连接 11.3.2 相关的操作接口 11.3.3 插入Lob类型的数据 11.3.4 以块数据方式读取Lob数据 11.3.5 以流数据方式读取Lob数据 11.4 自增键和行集 11.4.1 自增键的使用 11.4.2 如何规划主键方案 11.4.3 以行集返回数据 11.5 其他类型的JDBCTemplate 11.5.1 NamedParameterJDBCTemplate 11.5.2 SimpleJDBCTemplate 11.6 以OO方式访问数据库 11.6.1 使用MappingSqlQuery查询数据 11.6.2 使用SqlUpdate更新数据 11.6.3 使用StoredProcedure执行存储过程 11.6.4 SqlFunction类 11.7 小结 第12章 整合其他ORM框架 12.1 Spring整合ORM技术 12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate 12.2.3 处理LOB类型数据 12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis 12.3.3 编写myBatis的DAO 12.5 DAO层设计 12.5.1 DAO基类的设计 12.5.2 查询接口方法的设计 12.5.3 分页查询接口设计 12.6 小结 第4篇 业务层及Web层技术 第13章 任务调度和异步执行器 13.1 任务调度概述 13.2 Quartz快速进阶 13.2.1 Quartz基础结构 13.2.2 使用SimpleTrigger 13.2.3 使用CronTrigger 13.2.4 使用Calendar 13.2.5 任务调度信息存储 13.3 在Spring中使用Quartz 13.3.1 创建JobDetail 13.3.2 创建Trigger 13.3.3 创建Scheduler 13.4 Spring中使用JDK Timer 13.4.1 Timer和TimerTask 13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用程序集群的影响 13.6.3 任务调度云 13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速入门 14.2.3 使用XStream别名 14.2.4 XStream转换器 14.2.5 XStream注解 14.2.6 流化对象 14.2.7 持久化API 14.2.8 额外功能:处理JSON 14.3 其他常见O/X Mapping开源项目 14.3.1 JAXB 14.3.2 XMLBeans 14.3.3 Castor 14.3.4 JiBX 14.3.5 总结比较 14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小结 第15章 Spring MVC 15.1 Spring MVC概述 15.1.1 体系结构 15.1.2 配置DispatcherServlet 15.1.3 一个简单的实例 15.2 注解驱动的控制器 15.2.1 使用@RequestMapping映射请求 15.2.2 请求处理方法签名概述 15.2.3 处理方法签名详细说明 15.2.4 使用HttpMessageConverter<T> 15.2.5 处理模型数据 15.3 处理方法的数据绑定 15.3.1 数据绑定流程剖析 15.3.2 数据转换 15.3.3 数据格式化 15.3.4 数据校验 15.4 视图和视图解析器 15.4.1 认识视图 15.4.2 认识视图解析器 15.4.3 JSP和JSTL 15.4.4 模板视图 15.4.5 Excel 15.4.6 PDF 15.4.7 输出XML 15.4.8 输出JSON 15.4.9 使用XmlViewResolver 15.4.10 使用ResourceBundle ViewResolver 15.4.11 混合使用多种视图技术 15.5 本地化解析 15.5.1 本地化概述 15.5.2 使用CookieLocaleResolver 15.5.3 使用SessionLocaleResolver 15.5.4 使用LocaleChangeInterceptor 15.6 文件上传 15.6.1 配置MultipartResolver 15.6.2 编写控制器和文件上传表单页面 15.7 杂项 15.7.1 静态资源处理 15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 16.2.3 使用JUnit 16.3 模拟利器Mockito 16.3.1 模拟测试概述 16.3.2 创建Mock对象 16.3.3 设定Mock对象的期望行为及返回值 16.3.4 验证交互行为 16.4 测试整合之王Unitils 16.4.1 Unitils概述 16.4.2 集成Spring 16.4.3 集成Hibernate 16.4.4 集成Dbunit 16.4.5 自定义扩展模块 16.5 使用Unitils测试DAO层 16.5.1 数据库测试的难点 16.5.2 扩展Dbunit用Excel准备数据 16.5.3 测试实战 16.6 使用unitils测试Service层 16.7 测试Web层 16.7.1 对LoginController进行单元测试 16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要功能流程描述 17.2 系统设计 17.2.1 技术框架选择 17.2.2 Web目录结构及类包结构规划 17.2.3 单元测试类包结构规划 17.2.4 系统的结构图 17.2.5 PO的类设计 17.2.6 持久层设计 17.2.7 服务层设计 17.2.8 Web层设计 17.2.9 数据库设计 17.3 开发前的准备 17.4 持久层开发 17.4.1 PO类 17.4.2 DAO基类 17.4.3 通过扩展基类所定义DAO类 17.4.4 DAO Bean的装配 17.4.5 使用Hibernate二级缓存 17.5 对持久层进行测试 17.5.1 配置Unitils测试环境 17.5.2 准备测试数据库及测试数据 17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的开发 17.6.2 ForumService的开发 17.6.3 服务类Bean的装配 17.7 对服务层进行测试 17.7.1 编写Service测试基类 17.7.2 编写ForumService测试用例 17.8 Web层开发 17.8.1 BaseController的基类 17.8.2 用户登录和注销 17.8.3 用户注册 17.8.4 论坛管理 17.8.5 论坛普通功能 17.8.6 分页显示论坛版块的主题帖子 17.8.7 web.xml配置 17.8.8 Spring MVC配置 17.9 对Web层进行测试 17.9.1 编写Web测试基类 17.9.2 编写ForumManageController测试用例 17.10 部署和运行应用 17.11 小结 以下内容详见本书配书光盘: 附录A JavaMail发送邮件 附录B 在Spring中开发Web Service

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值