spring transaction

ddatsh

dev #java #spring

三个组成部分:DataSource、TransactionManager和代理机制

无论哪种配置方式,一般变化的只是代理机制这部分

DataSource、TransactionManager 只根据数据访问方式有所变化

Hibernate DataSource 实现为 SessionFactory

TransactionManager 实现为 HibernateTransactionManager

一 、每个Bean都有一个代理

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns ="http://www.springframework.org/schema/beans"
       xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:context ="http://www.springframework.org/schema/context"
                xmlns:aop ="http://www.springframework.org/schema/aop"
            xsi:schemaLocation ="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop.xsd">

    <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>

    <!-- 配置DAO -->
    <bean id ="userDaoTarget" class ="com.bluesky.spring.dao.UserDaoImpl">
        <property name ="sessionFactory" ref ="sessionFactory" />
    </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>
</beans>

二、所有Bean共享一个代理基类

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns ="http://www.springframework.org/schema/beans"
       xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context ="http://www.springframework.org/schema/context"
       xmlns:aop ="http://www.springframework.org/schema/aop"
       xsi:schemaLocation ="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop.xsd">

    <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>

    <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>
</beans>

三、拦截器

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns ="http://www.springframework.org/schema/beans"
       xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context ="http://www.springframework.org/schema/context"
       xmlns:aop ="http://www.springframework.org/schema/aop"
       xsi:schemaLocation ="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop.xsd">

    <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>

    <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>
</beans>

四、tx 标签配置的拦截器

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns ="http://www.springframework.org/schema/beans"
       xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context ="http://www.springframework.org/schema/context"
       xmlns:aop ="http://www.springframework.org/schema/aop"
       xmlns:tx ="http://www.springframework.org/schema/tx"
       xsi:schemaLocation ="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx.xsd">

    <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" />
        </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>
</beans>

五、全注解

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns ="http://www.springframework.org/schema/beans"
       xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context ="http://www.springframework.org/schema/context"
       xmlns:tx ="http://www.springframework.org/schema/tx"
       xsi:schemaLocation ="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:annotation-config />
    <context:component-scan base-package ="com.bluesky" />

    <tx:annotation-driven transaction-manager ="transactionManager" />

    <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>

</beans>

DAO 加上@Transactional

@Transactional
@Component( " userDao " )
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    public List < User > listUsers() {
        return this .getSession().createQuery( " from User " ).list();
    }