测试SSH框架分层整合及验证事务是否有效
在《SSH框架整合》教程中,分别对 Spring 与 Hibernate 的整合、Spring 与 Struts2 的整合进行了详细讲解,本节我们来测试框架分层的整合和验证 Spring 的事务管理是否有效。
测试框架分层的整合
细心的读者一定会发现,虽然在《SSH框架整合》教程项目中的三大框架已经整合成功,但就项目的三层结构来说,却缺少了 Service 和 DAO 之间的整合调用,接下来将对 Service 和 DAO 的整合进行讲解。
在讲解 Service 和 DAO 的整合之前,先来了解两个类:HibernateTemplate 和 HibernateDaoSupport,这两个类是 Spring 为整合 Hibernate3 提供的两个工具类。
HibernateTemplate 是 Spring 的模板工具类之一,它只需要获得一个 SessionFactory 就可以执行持久化操作。HibernateDaoSupport 是 Spring 为实现 DAO 组件提供的一个工具类,它主要提供了两个方法以简化 DAO 的实现,具体如下。
- Public final HibernateTemplate getHibernateTemplate()
- Public final void setSessionFactory(SessionFactory sessionFactory)
其中,getHibernateTemplate() 方法用于返回一个 HibernateTemplate 对象,一旦获得了 HibernateTemplate 对象,剩下的 DAO 实现将由该对象完成,而 setSessionFactory() 方法可用于接收 Spring 的依赖注入。
了解了 Spring 整合 Hibernate 的两个工具类后,下面分步骤讲解 Service 和 DAO 层之间的整合过程。
1. 实现 DAO
1)创建 PersonDao 接口
在 src 下创建一个名称为 com.mengma.ssh.dao 的包,在该包中创建一个名称为 PersonDao 的接口,接口中定义了一个 save 方法,其代码如下所示。
package com.mengma.ssh.dao; import com.mengma.ssh.domain.Person; public interface PersonDao { public void save(Person person); }
2)创建接口实现类 PersonDaoImpl
在 src 下创建一个名称为 com.mengma.ssh.dao.impl 的包,在该包中创建 PersonDao 接口的实现类 PersonDaoImpl,该类中实现了 PersonDao 接口中的方法。其代码如下所示。
package com.mengma.ssh.dao.impl; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.mengma.ssh.dao.PersonDao; import com.mengma.ssh.domain.Person; public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao { @Override public void save(Person person) { this.getHibernateTemplate().save(person); System.out.println("personDao save..."); } }
在上述代码中,继承了 HibernateDaoSupport,并实现了 PersonDao 接口,在 save() 方法中,调用了 HibernateTemplate 的 save() 方法保存 person 对象,并使用输出语句在控制台输出了“personDao save...”信息。
2. 实现Service
1)编写 Service 层接口方法
在 PersonService 接口中,创建一个 save() 方法,其方法代码如下所示:
public void save(Person person);
2)编写 Service 层接口实现类方法
在 PersonServiceImpl 类中,实现 PersonService 接口中的 save 方法,然后声明 PersonDao 属性,并编写其 getter 和 setter 方法。其主要代码如下所示:
private PersonDao personDao; // 声明PersonDao public PersonDao getPersonDao() { return personDao; } public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } @Override public void save(Person person) { this.personDao.save(person); }
3. 添加 Spring 配置信息
1)添加 Bean 实例
在 applicationContext_person.xml 中创建 PersonDao 的 Bean 实例,并将 personDao 实例注入 personService 中,其主要代码如下所示:
<!-- dao --> <bean id="personDao" class="com.mengma.ssh.dao.impl.PersonDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- service --> <bean id="personService" class="com.mengma.ssh.service.impl.PersonServiceImpl"> <!-- 将personDao实例注入personService中 --> <property name="personDao" ref="personDao"/> </bean>
2)添加事务配置
在 applicationContext.xml 中添加事务的配置信息,其添加代码如下所示:
<!-- 事务管理器,依赖于数据源 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 注册事务管理驱动 --> <tx:annotation-driven transaction-manager="txManager" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!--通知:增强事务 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <!--如果不把save update delete都配置上,则这些操作会无效 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="find*" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <!-- 切入点 --> <aop:pointcut expression="execution(* com.mengma.service.*.*(..))" id="txPointCut" /> <!--advisor特殊的切面(一个切入点和一个通知) --> <aop:advisor pointcut-ref="txPointCut" advice-ref="txAdvice" /> </aop:config> <!-- 1.1确定文件位置 --> <property name="configLocation" value="classpath:hibernate/hibernate.cfg.xml" /> <!-- 1.2配置hbm.xml映射文件,mappingDirectoryLocationd表示本地映射文件的目录 --> <property name="mappingDirectoryLocations" value="classpath:com/mengma/*/domain" /> </bean>
在上述代码中,首先配置了事务管理器,然后配置了事务的通知信息,最后通过切入点表达式,指定了需要进行事务控制的类。需要注意的是,上述代码中切入点表达式中的 expression 内容,表示拦截以 service 结尾的 Bean。
4. 编写测试方法
在测试类 TestMerge 中,创建一个名称为 PersonServiceAndDao 的方法,测试 Service 和 Dao 层的整合,该方法代码如下所示:
@Test public void PersonServiceAndDao() { PersonService ts = (PersonService) ctx.getBean("personService"); ts.save(new Person("用户2")); }
在上述代码中,首先获取了 personService 实例,然后调用实例的 save() 方法保存了一个名称为“用户 2”的对象。使用 JUnit 运行上述方法成功后,查询数据库中 person 表中的数据,其结果如图 1 所示。
发表评论