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

参考:《Spring 2.0 宝典》 李刚 编著

Ch8 DAO支持

    DAOJ2EE应用的重要组件,实现了业务逻辑和数据库访问的分离。DAO模式通常和工厂模式相结合。

8.1 SpringDAO的体系

8.1.1 统一的异常继承体系

    所有持久层访问的异常都继承DataAccessException

8.2 常见的DAO支持类

    Spring对于多种数据库访问技术的DAO支持,包括HibernateJDOTopLink,iBATISOJBJpa等等。通过下面3个组件完成:

l         DaoSupport

l         Template

l         Callback

8.2.1 SpringJDBCDAO支持

8.2.2 SpringHibernateDAO支持

8.3 DAO模式的异常处理

    DAO执行的是数据库访问操作,可能抛出底层的SQLException,而底层的异常不应该暴露给客户端,DAO应该负责扑获这些异常,而不应该把这些异常扩散到业务逻辑层。


Ch9 使用JDBC操作数据库

    Spring支持将查询结果对像化,通过使用RowMapper,可将ResultSet映射为对象集合,然后返回该对象集合。

    在传统的数据库连接方式(通过DriverManager)中,一个数据库连接对象对应一个物理数据库连接,频繁的打开关闭操作造成系统性能低下。连接池的解决方案是:当程序启动时,系统建立足够的数据库连接,并将这些连接组成一个连接池。对于共享资源,一个通用的设计模式是-资源池(Resource Pool)。常见的数据库连接池有DBCP连接池和C3P0连接池。SpringJDBC与传统的JDBC操作的优点如下:

l         简化连接获取方式,SpringJDBC连接依赖IoC容器注入。

l         模板化的操作方式,无需繁琐的getConnectioncreateStatement等操作。

l         优秀的面向对象操作方式,结果集直接转换成JavaBean传出。

l         一致的异常继承体系,无需扑捉JDBC特定的数据库异常,JDBCchecked异常被包装成Runtime异常,不再要求强制扑获。

    JdbcTemplateSpring JDBC的核心类,功能强大。功能有:

l         执行简单查询

l         执行简单更新

l         执行简单DDL

l         使用StatementCallback访问数据库

l         使用PreparedStatementCallback访问数据库

    连接数据库的辅助类:

l         使用数据源工具类(DataSourceUtils),与使用DataSourcegetConnection直接获取连接相比,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的管理下才能同步到数据库。SessionSessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像。通常一个应用对应一个SessionFactory对象。SessionFactory对象由Configuration对象生成。Configuration对象用来加载Hibernate配置文件。要知道Hibernate的关系映射,以及HQL查询知识。在HQL中,操作对象是类、实例和属性,而不是表格、列、行等概念。Hibernate还提供了一种更对象化的查询方式:Criteria查询。Criteria使用组合器模式来增加查询条件。Spring整合Hibernate后,使持久层的访问更加容易:

l         通用的资源管理:SpringApplicationContext能管理SessionFactory,使得配置值很容易的被管理和修改,无需使用Hibernate的配置文件。

l         有效的Session管理提供有效、简单和安全的Hibernate Session处理。

l         方便的事务管理:Spring的事务管理粒度是方法级。

l         异常包装:包装Hibernate的异常,使它们从checked exception变为runtime exception

    SpringHibernate进行了简化,使用HibernateTemplate,提供持久层访问模板化。Hibernate的复杂用法:HibernateCallback,该接口的方法doInHibernate(net.sf.hibernate.Session session)内可以访问Session,该Session对象是绑定到该线程的Session实例。该方法内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证对于复杂的持久层访问,依然可以使用Hibernate的方式。

    HibernateDAO实现:

l         继承HibernateDaoSupport实现DAO

l         基于Hibernate3.0实现DAO,一种新的技术“contextual sessions”,每次事务一个session


Ch11 SpringMVC框架

目前流行的MVC框架:

l         Struts,目前已经分化为2个项目:Struts Action FrameworkShale Framework

l         WebWork2,目前融入到了Struts Action Framework

l         JSFJavaServer 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         将用户输入参数封装成VOvalue object)对象。例如SpringCommand对象,Strutsactionform都是VO对象。

l         接收业务层组件传出的数据。

l         数据与合适的表现层技术集合,呈现给用户。

常用的表现层技术:JSPJSTLVelocityXSLT

1.    整合JSTL

提供JstlView来使用JSTL视图。支持JSTL的视图解析器分别有以下2种:

l         ResourceBundleViewResolver

l         InternalResourceViewResolver

2.    整合Velocity

    Velocity基于java的模板引擎。通过Velocityweb的页面设计者专注于页面的设计,业务逻辑设计者则专注于代码实现。Velocity将代码从表现逻辑中分离,是JSP表现逻辑的替代方案。

3.    整合XSTL视图

XML是一种标记语言,简化了数据交换、进程间消息交换的过程。XML的应用大概分为下面3类:

l         简单数据的表示和交换:例如SAXDOM等。

l         面向消息的计算:例如XML-RPCSOAP、电子商务XMLebXML)。

l         用户界面相关:XSLXSLT

4.1      XSLT介绍

    样式表(style sheet)是一种专门描述结构文档表现方式的文件,它既可以描述这些文档如何在屏幕上显示,也可以描述它们的打印效果。样式表一般不包含在XML文档内部,而以独立的文档方式存在。W 3C 给出了CSScascading style sheet)和可扩展样式语言XSLextensible style language2种样式表的推荐标准。XSL2大部分组成:描述如何将一个XML文档进行转换成可浏览的或者可输出的格式;定义格式对象FOformatted object),其协议是XSLT。将XML文档原文输入,使用XSLT作为模板,通过转换引擎,最终输出需要的HTML文档。

4.2 生成Excel表格或者PDF文档

    Spring支持从数据动态生成PDFExcel文件,以文档本身作为视图。服务器以流的方式加模型数据返回文档。

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         SpringHTTP调用器

l         Hessian

l         Burlap

l         JAX RPC

14.1 使用Hessian通过http提供服务

    相比web serviceHessian使用是二进制RPC协议,适合发送二进制数据。更简单、快捷。

14.2 通过web service提供服务

14.3 使用HttpInvoker提供远程服务

    不需要额外的类库,与Hessian的轻量级传输协议不同的是:SpringHttpInvoker采用的是java序列化来序列化参数和返回值,然后基于HTTP协议传输经过序列化后的对象。当参数或者返回值是复杂类型,并且不能通过Hessian的序列化机制序列化时,HttpInvoker就很有优势。使用HttpInvoker和使用Hessian很相似:SpringHessian提供了HessianServiceExporter;为HttpInvoker提供了HttpInvokerServiceExporter


Ch15 EJB的访问和实现

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


Ch16 Spring中使用JMS

    Spring提供了一个JMS API的抽象框架。JMS主要分为消息生产和消息消费2个功能块。在J2EE中,消息驱动bean提供了异步消费消息的功能。而在独立的应用中,则必须创建MessageListener或者ConnectionConsumer来消费消息。Spring提供JmsTemplate类,该类用于简化消息的生产。JMS的作用就像是一个智能交换机,路由分布式应用中各组件发出的消息。JMS提供一组基本对象。对PTPPub/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. SpringJMS的支持

    消息的发送和接收都是使用JmsTemplate类来完成。


Ch17 利用Spring发送邮件

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


Ch18 Spring中的任务调度

    应用系统中常常需要周期性的执行某个任务,例如每天定点判断员工的出勤情况等。Spring支持JDK内置的Timer,也支持OpenSymphonyQuartz Scheduler。两个任务调度器通过FactoryBean建立,可以注入Timers或者Triggers的引用。更进一步的,对于Quartz SchedulerTimer调度器,还可以通过工具类调用目标对象。所有无需用户请求,就应自动执行的任务都应该使用任务调度驱动。

1. JDK Timer介绍

    任务调度类继承类TimerTask,重写run()方法;调度任务调用Timerschedule()方法。

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         业务层:提供类AbstractDependencyInjectionSpringContextTestsAbstractTransactionalSpringContextTests,具有依赖注入的能力。

l         持久层:提供AbstractTransactionalDataSourceSpringContextTests,直接访问数据库,可以保证测试中的修改不会影响数据库记录。

l         此外,扩展了junit框架,提供了许多额外工具。

软件测试并不是软件质量保证。

1.    Junit简介

用于白盒测试和回归测试。

2. 利用DI完成集成测试

 

 

你可能感兴趣的:(Spring)