首页 > 代码库 > spring---transaction(6)---事务的配置

spring---transaction(6)---事务的配置

1 写在前面

  上一篇我们了解到spring的事务的体系。这里我们将结合上篇讲spring事务的配置

 

 

2 Spring的三种事务配置形式

   2.1 使用TransactionProxyFactoryBean

<bean id="proxy"
   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <!-- 为事务代理工厂Bean注入事务管理器 -->
    <property name="transactionManager" ref="transactionManager" />
    <!-- 要在哪个Bean上面创建事务代理对象 -->
    <property name="target" ref="productDao" />
    <!-- 指定事务属性 -->
    <property name="transactionAttributes">
        <props>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

  案例分析(上面有三大配置):

  • 事务管理器transactionManager
  • 事务配置的提供者transactionAttributes(用于指定哪些方法具有什么样的事务配置)

    有了以上2个元素,我们就可以创建出一个事务拦截器TransactionInterceptor

  • 要代理的对象target

TransactionProxyFactoryBean这个工厂bean创建代理对象的原理就是:通过ProxyFactory来对target创建出代理对象了,同时加入上述事务拦截器,就可以实现事务拦截功能了

 

  2.2 使用aop:config和tx:advice

    使用TransactionProxyFactoryBean的方式只能针对一个target进行代理,如果想再代理一个target,就需要再配置一个TransactionProxyFactoryBean,比较麻烦,所以使用apo:config的配置形式,就可以针对符合Pointcut的所有target都可以进行代理。

    配置案例如下:

<tx:advice id="txAdvice" transaction-manager="transactionManager">  
    <tx:attributes>  
        <tx:method name="add*" propagation="REQUIRED" />  
        <tx:method name="delete*" propagation="REQUIRED" />  
        <tx:method name="update*" propagation="REQUIRED" />  
        <tx:method name="add*" propagation="REQUIRED" />    
    </tx:attributes>  
</tx:advice>  

<aop:config>  
    <aop:pointcut id="pointcut" 
        expression="XXXX" />  
    <aop:advisor advice-ref="txAdvice" 
        pointcut-ref="pointcut" />  
</aop:config>

 

  案例分析(上面有两大配置):

  • tx:advice:   有事务管理器transactionManager和事务配置提供者attributes,就可以产生一个事务拦截器TransactionInterceptor
  • aop:config: 这里会对符合pointcut的bean创建出代理对象,同时加入上述创建的事务拦截器

 

2.3 使用@Transactional

  使用aop:config可以在xml中进行代理的配置,有时候想在代码中直接进行配置,这时候就需要使用注解@Transactional。

  案例如下(xml中启动@Transactional注解扫描):

    <!-- 开启注解事务管理 -->
    <tx:annotation-driven transaction-manager="txManager" />

  这样在代码中就可以通过配置@Transactional来实现事务拦截了

  在xml配置中启动注解扫描,会把那些加入了@Transactional标记的容器bean创建出代理对象,同时加入事务拦截器。在执行事务拦截的时候,会从@Transactional注解中取出对应的事务配置和事务管理器配置,进而可以执行事务的创建等操作。

spring---transaction(6)---事务的配置