您的位置:首页 > 编程语言 > Java开发

Spring与其他工具、框架整合应用

2007-02-07 13:58 288 查看
参考:《Spring 2.0 宝典》 李刚 编著

Ch8 DAO支持
DAO是J2EE应用的重要组件,实现了业务逻辑和数据库访问的分离。DAO模式通常和工厂模式相结合。
8.1 Spring中DAO的体系
8.1.1 统一的异常继承体系
所有持久层访问的异常都继承DataAccessException。
8.2 常见的DAO支持类
Spring对于多种数据库访问技术的DAO支持,包括Hibernate、JDO、TopLink,iBATIS、OJB、Jpa等等。通过下面3个组件完成:
l DaoSupport
l Template
l Callback
8.2.1 Spring对JDBC的DAO支持
8.2.2 Spring对Hibernate的DAO支持
8.3 DAO模式的异常处理
DAO执行的是数据库访问操作,可能抛出底层的SQLException,而底层的异常不应该暴露给客户端,DAO应该负责扑获这些异常,而不应该把这些异常扩散到业务逻辑层。

Ch9 使用JDBC操作数据库
Spring支持将查询结果对像化,通过使用RowMapper,可将ResultSet映射为对象集合,然后返回该对象集合。
在传统的数据库连接方式(通过DriverManager)中,一个数据库连接对象对应一个物理数据库连接,频繁的打开关闭操作造成系统性能低下。连接池的解决方案是:当程序启动时,系统建立足够的数据库连接,并将这些连接组成一个连接池。对于共享资源,一个通用的设计模式是-资源池(Resource Pool)。常见的数据库连接池有DBCP连接池和C3P0连接池。Spring的JDBC与传统的JDBC操作的优点如下:
l 简化连接获取方式,Spring的JDBC连接依赖IoC容器注入。
l 模板化的操作方式,无需繁琐的getConnection、createStatement等操作。
l 优秀的面向对象操作方式,结果集直接转换成JavaBean传出。
l 一致的异常继承体系,无需扑捉JDBC特定的数据库异常,JDBC的checked异常被包装成Runtime异常,不再要求强制扑获。
JdbcTemplate是Spring JDBC的核心类,功能强大。功能有:
l 执行简单查询
l 执行简单更新
l 执行简单DDL
l 使用StatementCallback访问数据库
l 使用PreparedStatementCallback访问数据库
连接数据库的辅助类:
l 使用数据源工具类(DataSourceUtils),与使用DataSource的getConnection直接获取连接相比,DataSourceUtils获取的连接更智能:在必要时会自动关闭,无需手动关闭。
l 智能数据源(SmartDataSource)接口:除了提供DataSource的基本方法之外,还可以在恰当的时候关闭连接。即通过SmartDataSource获得的连接无需关闭,SmartDataSource知道何时关闭连接。
l 单连接数据源SingleConnectionDataSource:是SmartDataSource的实现类。主要作用是用来测试,单连接的DataSource。连接永远不会关闭,直至销毁SingleConnectionDataSource实例。
l 另一个数据源实现DriverManagerDataSource,主要用于测试,不要在实际项目中使用。总是获得新的连接。
l 数据源的事务管理器DataSourceTransactionManager,是局部数据源的事务策略实现。
数据库操作的对象化:
Spring允许以面向对象的方式操作数据库,包括结果集的对象化,查询、更新、插入等操作的对象化等。由org.springframework.jdbc.object中的类完成。
l 查询结果对象化,有2种方法:使用RowMapper接口;使用MappingSqlQuery或者MappingSqlQueryWithParameters。
l 查询对象,父类是SqlQuery,很少直接使用这个类,而是它的子类。
l 更新对象,通常继承SqlUpdate类实现。
l 使用StoredProcedure调用存储过程或函数。调用存储过程或函数的步骤十分相似,只是function属性有区别,调用存储过程时将该属性设为false,调用函数时将该属性设为true。
l 使用SqlFunction执行查询或调用函数。主要功能是执行查询,而不是调用函数。

Ch10 整合Hibernate执行持久化操作
Hibernate是目前最流行的ORM框架,是面向对象的程序设计语言和关系数据库之间的桥梁,允许开发者以面向对象的方式来操作关系数据库。对PO的操作,必须在Session的管理下才能同步到数据库。Session由SessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像。通常一个应用对应一个SessionFactory对象。SessionFactory对象由Configuration对象生成。Configuration对象用来加载Hibernate配置文件。要知道Hibernate的关系映射,以及HQL查询知识。在HQL中,操作对象是类、实例和属性,而不是表格、列、行等概念。Hibernate还提供了一种更对象化的查询方式:Criteria查询。Criteria使用组合器模式来增加查询条件。Spring整合Hibernate后,使持久层的访问更加容易:
l 通用的资源管理:Spring的ApplicationContext能管理SessionFactory,使得配置值很容易的被管理和修改,无需使用Hibernate的配置文件。
l 有效的Session管理:提供有效、简单和安全的Hibernate Session处理。
l 方便的事务管理:Spring的事务管理粒度是方法级。
l 异常包装:包装Hibernate的异常,使它们从checked exception变为runtime exception。
Spring对Hibernate进行了简化,使用HibernateTemplate,提供持久层访问模板化。Hibernate的复杂用法:HibernateCallback,该接口的方法doInHibernate(net.sf.hibernate.Session session)内可以访问Session,该Session对象是绑定到该线程的Session实例。该方法内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证对于复杂的持久层访问,依然可以使用Hibernate的方式。
Hibernate的DAO实现:
l 继承HibernateDaoSupport实现DAO;
l 基于Hibernate3.0实现DAO,一种新的技术“contextual sessions”,每次事务一个session。

Ch11 SpringMVC框架
目前流行的MVC框架:
l Struts,目前已经分化为2个项目:Struts Action Framework;Shale Framework。
l WebWork2,目前融入到了Struts Action Framework。
l JSF(JavaServer Faces),一种标准,而非框架,核心是事件驱动,使用DI。
l Tapestry
MVC框架的基本特征
l 前端核心控制器负责拦截用户请求;
l 提取客户端请求参数,将请求参数封装成值对象;
l 根据不同的请求,核心控制器调用业务控制器,业务控制器由用户实现;
l 调用业务控制器的时候,请求值对象也一并传入(通常,业务控制器还需要调用业务逻辑层组件进行处理);
l 业务控制器完成运算后,返回一个结果对象;
l 核心控制器收到业务控制器的计算结果,决定呈现哪个视图给用户;
l 结果对象与特定表现层组件结合,然后呈现给用户。
Spring MVC框架中的角色
l 核心控制器DispatcherServlet
l 业务处理器
l 处理器映射
l 视图和视图解析器
l 模型
l Command对象

Ch12 整合第三方MVC框架

Ch13 整合第3方表现层技术
1. 表现层简介
View负责收集用户输入,也负责向用户显示处理结果,是系统和用户的接口。功能如下:
l 收集用户参数,通常使用form对象接收用户输入参数。
l 完成用户输入参数的简单校验,基本语义校验。
l 将用户输入参数封装成VO(value object)对象。例如Spring的Command对象,Struts的actionform都是VO对象。
l 接收业务层组件传出的数据。
l 数据与合适的表现层技术集合,呈现给用户。
常用的表现层技术:JSP、JSTL、Velocity、XSLT。
1. 整合JSTL
提供JstlView来使用JSTL视图。支持JSTL的视图解析器分别有以下2种:
l ResourceBundleViewResolver
l InternalResourceViewResolver
2. 整合Velocity
Velocity基于java的模板引擎。通过Velocity,web的页面设计者专注于页面的设计,业务逻辑设计者则专注于代码实现。Velocity将代码从表现逻辑中分离,是JSP表现逻辑的替代方案。
3. 整合XSTL视图
XML是一种标记语言,简化了数据交换、进程间消息交换的过程。XML的应用大概分为下面3类:
l 简单数据的表示和交换:例如SAX、DOM等。
l 面向消息的计算:例如XML-RPC、SOAP、电子商务XML(ebXML)。
l 用户界面相关:XSL、XSLT
4.1 XSLT介绍
样式表(style sheet)是一种专门描述结构文档表现方式的文件,它既可以描述这些文档如何在屏幕上显示,也可以描述它们的打印效果。样式表一般不包含在XML文档内部,而以独立的文档方式存在。W3C给出了CSS(cascading style sheet)和可扩展样式语言XSL(extensible style language)2种样式表的推荐标准。XSL由2大部分组成:描述如何将一个XML文档进行转换成可浏览的或者可输出的格式;定义格式对象FO(formatted object),其协议是XSLT。将XML文档原文输入,使用XSLT作为模板,通过转换引擎,最终输出需要的HTML文档。
4.2 生成Excel表格或者PDF文档
Spring支持从数据动态生成PDF或Excel文件,以文档本身作为视图。服务器以流的方式加模型数据返回文档。
3.2.1 POI介绍
3.2.2 iText简介
iText可以用来生成PDF文件。如果需要出现中文,还需要iText的另一个辅助项目iTextAsian。

l Ch14 通过Spring进行远程访问和WebService
分布式应用的意义:
l 远程应用可提供多个计算单元的协同服务
l 远程访问能够提供更好的可靠性和可用性
l 远程访问能提供更好的透明性
l 远程访问能够提供更好的开放性和可伸缩性
常见的远程访问技术:
l RMI
l Hession
l EJB
l Burlap
l JAX-RPC
Spring对远程访问的支持:
l RMI
l Spring的HTTP调用器
l Hessian
l Burlap
l JAX RPC
14.1 使用Hessian通过http提供服务
相比web service,Hessian使用是二进制RPC协议,适合发送二进制数据。更简单、快捷。
14.2 通过web service提供服务
14.3 使用HttpInvoker提供远程服务
不需要额外的类库,与Hessian的轻量级传输协议不同的是:Spring的HttpInvoker采用的是java序列化来序列化参数和返回值,然后基于HTTP协议传输经过序列化后的对象。当参数或者返回值是复杂类型,并且不能通过Hessian的序列化机制序列化时,HttpInvoker就很有优势。使用HttpInvoker和使用Hessian很相似:Spring为Hessian提供了HessianServiceExporter;为HttpInvoker提供了HttpInvokerServiceExporter。

Ch15 EJB的访问和实现
Spring的IoC容器本身就是优秀的工厂,由该工厂根据EJB的JNDI负责产生和管理EJB代理。Spring容器还负责管理EJB代理与其他组件的依赖关系,并负责管理EJB代理的销毁、资源回收工作等。在这种方式下,服务定位器的功能由Spring的配置文件定义,而业务代理由Spring的容器负责产生和维护。客户端程序只和Spring生成的EJB代理交互。

Ch16 Spring中使用JMS
Spring提供了一个JMS API的抽象框架。JMS主要分为消息生产和消息消费2个功能块。在J2EE中,消息驱动bean提供了异步消费消息的功能。而在独立的应用中,则必须创建MessageListener或者ConnectionConsumer来消费消息。Spring提供JmsTemplate类,该类用于简化消息的生产。JMS的作用就像是一个智能交换机,路由分布式应用中各组件发出的消息。JMS提供一组基本对象。对PTP和Pub/Sub,每个对象都是单独定义的,但其基本功能是相同的。JMS系统中有如下基本对象:
l 连接工厂:由服务器管理员创建,并绑定到JNDI树上。JMS客户端使JNDI查找、定位连接工厂,然后利用连接工厂创建连接。
l 连接:表示客户机和服务器之间的活动连接。JMS通过连接工厂创建连接。JMS连接是个相当重要的对象。通常每个客户机使用单独的连接,而每个连接则可以连接多个JMS目的。
l JMS会话:表示客户机和JMS之间服务器之间的通信状态。JMS会话建立在连接之上,表示JMS客户机与服务器之间的通信线程。会话定义消息的顺序。JMS使用会话进行事务性的消息处理。
l JMS消息目的:是消息生产者发送消息的目的地,也是消息消费者获取消息的消息源。
1. JMS开发
发送步骤可以归纳如下:
l 连接工厂创建JMS连接。
l JMS连接创建JMS会话。
l JMS会话创建JMS消息生产者。
l JMS会话创建空JMS消息。
l JMS消息调用自身的方法填充内容。
l JMS消息生产者发送消息。
两种模型的接收步骤也很相似:
l 连接工厂创建JMS连接。
l JMS连接创建JMS会话。
l JMS会话创建JMS消费者。
l JMS消费者接收消息,同步和异步接收消息的方式略有差异。
消息的处理可以完成丰富的功能,JMS的一个成功的应用就是消息驱动Bean。消息驱动EJB是一个JMS消息监听者,是一个消息的异步消费者。消息驱动EJB采用观察者设计模式。
2. Spring对JMS的支持
消息的发送和接收都是使用JmsTemplate类来完成。

Ch17 利用Spring发送邮件
Spring的Email抽象层简化了JavaMail的使用,它通过模版式的操作。通过使用JavaMailSender,无须处理连接邮件服务器等繁琐的细节,可以仅提供发送的邮件内容,即可完成邮件的发送。邮件抽象层的主要包是org.springframework.mail。MailSender提供简单的邮件发送方法;而JavaMailSender则可用于发送MimeMessage信息,MimeMessagePreparator回调接口用于创建MimeMessage实例。

Ch18 Spring中的任务调度
应用系统中常常需要周期性的执行某个任务,例如每天定点判断员工的出勤情况等。Spring支持JDK内置的Timer,也支持OpenSymphony的Quartz Scheduler。两个任务调度器通过FactoryBean建立,可以注入Timers或者Triggers的引用。更进一步的,对于Quartz Scheduler和Timer调度器,还可以通过工具类调用目标对象。所有无需用户请求,就应自动执行的任务都应该使用任务调度驱动。
1. JDK Timer介绍
任务调度类继承类TimerTask,重写run()方法;调度任务调用Timer的schedule()方法。
4 Quartz的使用
例如:
l 用JavaMail发送邮件。
l 创建远程接口并且调用在EJB上的方法。
l 获取Hibernate Session,查询和更新关系数据库里的数据。
l 使用OSWorkflow,通过作业调用工作流。
l 调用Ant构建脚本执行预定义编译。
Quartz提供了2种基本作业存贮方式:
l RAMJobStore,它利用内存来持久化调度程序信息。这种作业存储类型容易配置、构造和运行。但是,调度信息保存在JVM的内存里面,程序一旦终止,所有信息都将丢失。
l JDBC作业存储。JDBC作业存储需要JDBC驱动程序和后台数据库保存调度信息。
Quartz的触发器:
Quartz的设计允许作业和作业调度分离,这通过触发器来完成。Quartz中的触发器用来确定作业的触发时机。2个常用的触发类型是SimpleTrigger(在给定的时间内,重复作业)和CronTrigger(基于Unix Cron表达式)。调度器用于将作业和触发器关联,一个作业可以关联多个触发器;一个触发器可以用于控制多个作业。Quartz的调度器由Scheduler接口实现。
5 在Spring中使用Timer
有两种实现方式:
l 继承TimerTask创建任务;需要使用ScheduledTimerTask来包装;Spring提供TimerFactoryBean工厂bean类,用于建立实际的调度。
l 使用MethodInvokingTimerTaskFactoryBean创建任务,同样需要使用ScheduledTimerTask来包装任务(此处的目标bean指向MethodInvokingTimerTaskFactoryBean的定义,实际是引用它的产品,也就是TimeTask任务);
4.在Spring中使用Quartz
有两种实现方式,区别主要体现在作业的创建上:
l 继承QuartzJobBean创建作业;Spring提供JobDetailBean包装job作业。使用SchedulerFactoryBean来建立实际的调度。
l 使用MethodInvokingDetailFactoryBean工厂bean创建作业。作业类可以是普通的java类。使用SchedulerFactoryBean来建立实际的调度。
Quartz的调度是非后台线程,创建容器实例即启动调度线程,调度线程不会退出。

Ch19 利用Spring简化测试
Spring为:
l 表现层:提供mock对象
l 业务层:提供类AbstractDependencyInjectionSpringContextTests和AbstractTransactionalSpringContextTests,具有依赖注入的能力。
l 持久层:提供AbstractTransactionalDataSourceSpringContextTests,直接访问数据库,可以保证测试中的修改不会影响数据库记录。
l 此外,扩展了junit框架,提供了许多额外工具。
软件测试并不是软件质量保证。
1. Junit简介
用于白盒测试和回归测试。
2. 利用DI完成集成测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐