基于Struts+Spring+Hibernate的Web应用框架的搭建(三)

来源:互联网 发布:深孔钻软件 编辑:程序博客网 时间:2024/06/06 01:51
  
在二的基础上,我们再给这个简单web应用增加声明式事务,声明式事务原来是EJB所引以为自豪的地方,现如今Spring框架的AOP也支持这功能,关于AOP的内容,这儿不想太深入,有兴趣的读者,可以参见本blog上有关Spring AOP方面的介绍,为了增加声明式事务,我们只需修改Spring的配置文件applicationContext.xml,
1.首先我们在配置文件中增加事务管理器,由于本应用采用了Hibernate,所以我们采用HibernateTransactionManager,配置如下:
<bean  id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
    <property name="sessionFactory">
      <ref local="sessionFactory"/>
    </property>
 </bean>
2.要在Sping使用声明式事务,我们得用TransactionProxyFactoryBean,它的作用就是把方法包裹在事务中,配置如下:
<bean id="bookService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
      <ref local="transactionManager"/>
    </property>
    <property name="target">
      <ref local=" registerTarget"/>
    </property>
    <property name="transactionAttributes">
      <props>
    <prop key="save*">
PROPAGATION_REQUIRED,-OrderException
</prop>
      </props>
    </property>
 </bean>
下面我们简单解释一下上面配置的意思:transactionManager属性引用一个事务管理器,在这里我们引用HibernateTransactionManager,target属性指定被代理的对象,transactionAttributes属性的save*表示在代理对象中所有以save开头的方法,PROPAGATION_REQUIRED表示代理对象中所有以save开头的方法都必须在事务中运行,-OrderException表示在执行以save开头的方法时,如果有OrderException异常抛出,则事务立即回滚。
完整的applicationContext.xml的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
 
<beans>   
 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost/register"/>
       <property name="username" value="root"/>
       <property name="password" value="root"/>
    </bean>   
 
    <!-- Hibernate SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="dataSource" ref="dataSource"/>
       <property name="mappingDirectoryLocations">
           <value>classpath:test/register/entity/</value>
       </property>
       <property name="hibernateProperties">
           <props>
              <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
              <prop key="hibernate.show_sql">true</prop>
              <prop key="hibernate.generate_statistics">true</prop>
           </props>
       </property>      
    </bean>   
   
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
      <ref local="sessionFactory"/>
    </property>
 </bean>
 
   <bean id="registerService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
      <ref local="transactionManager"/>
    </property>
    <property name="target">
      <ref local=" registerTarget"/>
    </property>
    <property name="transactionAttributes">
      <props>       
        <prop key="save*">PROPAGATION_REQUIRED,-OrderException</prop>
      </props>
    </property>
 </bean>
 
   <bean id="registerDAO" class="test.register.dao.RegisterDAO">
        <property name="sessionFactory" ref="sessionFactory"/>      
 </bean>
 
   <bean id="registerTarget" class="test.register.service.RegisterService">
        <property name="registerDAO" ref="registerDAO"/>     
 </bean> 
 
</beans>
3.同时还要修改action-servlets.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>   
    <bean name="/register"
class="test.register.action.RegisterAction">
       <property name="registerService" ref="registerTarget"/>    
    </bean>     
</beans>
<代码下载>
原创粉丝点击