- Spring中xml中配置事务属性有两种方式:
- 使用AspectJ AOP中的tx标签定义切面对象事务的属性
- 直接在事务代理(TransactionProxyFactoryBean)中添加属性
- 使用事务拦截器(TransactionInterceptor)批量处理带有相同事务属性的事务代理
使用AspectJ AOP + <tx:advice>
使用AspectJ的aop用切点表达式匹配批量注册bean代理,tx注册事务管理器代理
示例
<context:annotation-config />
<context:component-scan base-package="com.bluesky" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 定义事务的属性(隔离级别,传播行为,事物超时) --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 定义具体业务需要的事务属性 --> <tx:method name="*" propagation="REQUIRED" read-only="false"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="interceptorPointCuts" expression="execution(* com.bluesky.spring.dao.*.*(..))" /> <!-- 为切面对象添加事务 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config> |
直接在事务代理中添加属性
- 直接在事务代理中添加需要的事务属性参数(transactionAttributes)
- 创建事务管理器和XXXSessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
- 配置事务代理(TransactionProxyFactoryBean)
两种配置Bean的代理方式:
- 每个Bean都有一个事务代理
- 所有Bean共享一个事务代理基类(引入外部配置代理)
- 每个Bean都有一个事务代理
- 每个bean代理对象都作为事务代理的参数,手动加入
示例
<bean id="userDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置事务管理器 --> <property name="transactionManager" ref="transactionManager" /> <property name="target" ref="userDaoTarget" /> <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" /> <!-- 配置事务属性 --> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
<!-- 配置DAO --> <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> |
- 所有Bean共享一个事务代理基类(引入外部配置代理)
- 每个bean代理对象都作为一个公共事务代理的参数(即引入外部配置代理),手动加入
示例
<bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true"> <!-- 配置事务管理器 --> <property name="transactionManager" ref="transactionManager" /> <!-- 配置事务属性 --> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 配置DAO --> <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="userDao" parent="transactionBase"> <property name="target" ref="userDaoTarget" /> </bean> |
使用事务拦截器批量处理相同事务属性的事务代理
- 事务管理器分别引入匹配的所有Bean代理对象和TransactionInterceptor(注入transactionManager)
- 创建事务管理器和XXXSessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
- 创建事务拦截器(TransactionInterceptor)批量代理事务管理器,同时添加属性,同一个事务拦截器下的代理事务将拥有相同的事务属性
示例
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <!-- 配置事务属性 --> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>*Dao</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> <!-- 配置DAO --> <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> |