上一篇咱们了解到spring的事务的体系。这里咱们将结合上篇讲spring事务的配置spring
<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>
案例分析(上面有三大配置):express
有了以上2个元素,咱们就能够建立出一个事务拦截器TransactionInterceptorspa
TransactionProxyFactoryBean这个工厂bean建立代理对象的原理就是:经过ProxyFactory来对target建立出代理对象了,同时加入上述事务拦截器,就能够实现事务拦截功能了代理
使用TransactionProxyFactoryBean的方式只能针对一个target进行代理,若是想再代理一个target,就须要再配置一个TransactionProxyFactoryBean,比较麻烦,因此使用apo:config的配置形式,就能够针对符合Pointcut的全部target均可以进行代理。code
配置案例以下:xml
<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>
案例分析(上面有两大配置):对象
使用aop:config能够在xml中进行代理的配置,有时候想在代码中直接进行配置,这时候就须要使用注解@Transactional。blog
案例以下(xml中启动@Transactional注解扫描):事务
<!-- 开启注解事务管理 --> <tx:annotation-driven transaction-manager="txManager" />
这样在代码中就能够经过配置@Transactional来实现事务拦截了get
在xml配置中启动注解扫描,会把那些加入了@Transactional标记的容器bean建立出代理对象,同时加入事务拦截器。在执行事务拦截的时候,会从@Transactional注解中取出对应的事务配置和事务管理器配置,进而能够执行事务的建立等操做。