Spring事务管理者与Spring事务注解--声明式事务

1.在Spring的applicationContext.xml中配置事务管理者

PS:具体的说明请看代码中的注释

Xml代码:

    <!-- 声明式事务管理的配置 -->
    <!-- 添加事务管理者的bean -->    
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <!-- 为事务管理者类中的sessionFactory属性注入一个具体的实例 -->
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    
    <!-- 通知的配置 -->    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 指定需要开启并提交事务的方法 -->
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="del*" propagation="REQUIRED" />
            <tx:method name="mod*" propagation="REQUIRED" />
            <!-- 指定以上方法除外的方法是只读的    read-only -->
            <tx:method name="*" propagation="REQUIRED" read-only="true" />
        </tx:attributes>
    </tx:advice>
    
    <!-- 切面的配置(aop原理这里不多说,我的博文中有详细文章) -->
    <aop:config>
        
        <!-- 声明一个切入点 -->
        <aop:pointcut id="interceptorPointCuts" expression="execution(* app.dao.*.*(..))" />
        
        <!-- 引用一个通知并且同时引用一个需要执行的切入点 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
    </aop:config>

1_1.运行项目

程序报错如下:

org.springframework.beans.factory.BeanDefinitionStoreException

原因是缺少jar包{org.aopalliance}

Caused by: java.lang.ClassNotFoundException: org.aopalliance.intercept.MethodInterceptor

1_2.添加jar包,将这4个jar包导入到项目的lib目录下

                     

2.使用Spring提供的事务注解

@Transactional [使用事务注解,告诉Spring当前位类中需要事务的开启和提交,注解代码位置可以出现在类定义的前面或者方法上面]

@Transactional(readOnly=true) [使用事务注解,告诉Spring当前方法不需用到事务,只读]

类定义的前面声明事务注解,个别不需用到事务的方法设置为只读

Java代码:

@Transactional  
public class BcServiceImpl implements BcService {
    @Autowired
    private BcDao bd;
    
    @Override
    @Transactional(readOnly=true)  
    public List<BookCard> getAllBc() {
        // TODO Auto-generated method stub
        return bd.getAllBc();
    }

    @Override
    public String delSingleBc(Integer cid) {
        // TODO Auto-generated method stub
        return bd.delSingleBc(cid);
    }

}

只在方法上声明事务注解,即每个方法上都进行事务注解的声明

Java代码:

public class BcServiceImpl implements BcService {
    @Autowired
    private BcDao bd;
    
    @Override
    @Transactional(readOnly=true)  
    public List<BookCard> getAllBc() {
        // TODO Auto-generated method stub
        return bd.getAllBc();
    }

    @Override
    @Transactional
    public String delSingleBc(Integer cid) {
        // TODO Auto-generated method stub
        return bd.delSingleBc(cid);
    }

}

2_1.在Spring的applicationContext.xml中,添加一个驱动的bean,事务管理者

【PS:添加事务驱动者的bean后,通知的配置{<tx:advice />}和切面的配置{<aop:config />}都删除掉】

Xml代码:

    
    <!-- 声明式事务管理的配置 -->
    <!-- 添加事务管理者的bean -->    
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <!-- 为事务管理者类中的sessionFactory属性注入一个具体的实例 -->
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    
    <!-- 添加一个驱动的bean,事务管理者 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    

---------------------------------------------------

(over)

原文地址:https://www.cnblogs.com/LiJinfu/p/5985114.html