Spring 在xml配置里配置事务

事先准备:
配置数据源对象
用<bean>实例化各个业务对象。

1.配置事务管理器。

<bean id="transactionManager" class="org.springframework.jdbc.datasourceManager">
  <property name="datasource" ref="datasource"></property>
</bean>

2.配置事务属性

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="方法名" propagation="REQUIRES_NEW"/>    <!--新开事务-->
        <tx:method name="*"/>                                    <!--使用原有事务-->
    </tx:attributes>
</tx:advice>

3.配置事务切入点,注入事务属性

<aop:config>
    <aop:pointcut expression="execution(.......)" id="txPointCut"/>
    <aop:advisor advice-ref="txtAdvice" pointcut-ref="txtPointCut"/>
</aop:config>

实例:

准备工作:导入c3p0、Spring框架、Mysql、AOP的jar包,并配置好。

db.properties

driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/mydb
user=root
password=
minPoolSize=5
maxPoolSize=20
initialPoolSize=5

三个接口

package com.itnba.maya.dao;

public interface IInfoDao {
    public void delete(String code);
}
package com.itnba.maya.dao;

public interface IWorkDao {
    public void deleteInfocode(String code);
}
package com.itnba.maya.dao;

public interface IInfoService {
    public void delete(String code);

}

接口的实现类

package com.itnba.maya.daoimp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.itnba.maya.dao.IInfoDao;

public class InfoDao implements IInfoDao {

    private JdbcTemplate j;
    public JdbcTemplate getJ() {
        return j;
    }
    public void setJ(JdbcTemplate j) {
        this.j = j;
    }
    @Override
    public void delete(String code) {
        // 故意设置一个错误
        if(code.equals("p008")){
            int n=1/0;
        }

        String sql="delete from info where code=?";
        j.update(sql,code);
    }

}
package com.itnba.maya.daoimp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.itnba.maya.dao.IWorkDao;

public class WorkDao implements IWorkDao {

    private JdbcTemplate j;

    public JdbcTemplate getJ() {
        return j;
    }

    public void setJ(JdbcTemplate j) {
        this.j = j;
    }

    public void deleteInfocode(String code) {

        String sql="delete from work where infocode=?";
        j.update(sql,code);
    }

}
package com.itnba.maya.daoimp;

import com.itnba.maya.dao.IInfoDao;
import com.itnba.maya.dao.IInfoService;
import com.itnba.maya.dao.IWorkDao;

public class InfoService implements IInfoService {

    private IInfoDao infoDao;
    public IInfoDao getInfoDao() {
        return infoDao;
    }
    public void setInfoDao(IInfoDao infoDao) {
        this.infoDao = infoDao;
    }
    public IWorkDao getWorkdao() {
        return workdao;
    }
    public void setWorkdao(IWorkDao workdao) {
        this.workdao = workdao;
    }
    private IWorkDao workdao;
    public void delete(String code) {

        infoDao.delete(code);
        workdao.deleteInfocode(code);

    }

}

XML配置文件

<?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:tx="http://www.springframework.org/schema/tx"
    default-autowire="byName"
    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-4.3.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

        <!-- 引入db.properties文件 -->
        <context:property-placeholder location="classpath:db.properties"/>
        <!-- 生成连接池 -->
        <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
            <property name="driverClass" value="${driverClass}"></property>
            <property name="jdbcUrl" value="${jdbcUrl}"></property>
            <property name="user" value="${user}"></property>
            <property name="password" value="${password}"></property>
            <property name="minPoolSize" value="${minPoolSize}"></property>
            <property name="maxPoolSize" value="${maxPoolSize}"></property>
            <property name="initialPoolSize" value="${initialPoolSize}"></property>
        </bean>
        <!-- 生成JdbcTemplate -->
        <bean class="org.springframework.jdbc.core.JdbcTemplate" id="j">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        <!-- 配置实体类 -->
        <bean class="com.itnba.maya.daoimp.InfoDao" id="infoDao">
            <property name="j" ref="j"></property>
        </bean>
        <bean class="com.itnba.maya.daoimp.WorkDao" id="workDao">
            <property name="j" ref="j"></property>
        </bean>
            <bean class="com.itnba.maya.daoimp.InfoService" id="service">
            <property name="infoDao" ref="infoDao"></property>
            <property name="workdao" ref="workDao"></property>
        </bean>

        <!-- 配置事务管理器 -->
        <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        <tx:advice id="advice"     transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="*" propagation="REQUIRED"/><!-- *是对所有方法都加 -->
            </tx:attributes>
        </tx:advice>
        <!-- 用切点把事务切进去 -->
        <aop:config>
            <aop:pointcut expression="execution(* com.itnba.maya.daoimp..*.*(..))" id="pointcut"/>
            <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
        </aop:config>

</beans>

mian函数测试事务有没有生效:

package com.itnba.maya.daoimp;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.itnba.maya.dao.IInfoService;

public class Test {
    private static ApplicationContext context=null;

    private static IInfoService infoservice=null;

    static{
        context=new ClassPathXmlApplicationContext("beans.xml");
        infoservice=(IInfoService) context.getBean("service");

    }

    public static void main(String[] args) {

        infoservice.delete("p008");

    }

}

结果除0错误,数据回滚,数据库并没有删除。说明配置的事务生效了。

时间: 2024-08-04 07:05:44

Spring 在xml配置里配置事务的相关文章

不在JPA 的 persistence.xml 文件里配置Entity class的解决的方法

?? 在Spring 集成 Hibernate 的JPA方式中,须要在persistence配置文件里定义每个实体类.这样很地不方便.2种方法能够解决此问题: 这2种方式都能够实现不用在persistence.xml文件里配置每个实体类,从而免去每个Entity都要在persistence.xml文件里配置的烦恼,可是这样的方式Entity实体类的主键字段注解@ID要放到 getXXX()方法上.否则不认. 方式1: 改动"LocalContainerEntityManagerFactoryBe

spring在xml文件中配置bean的三种方法

一.最常见,也是缺省,是调用spring的缺省工厂类 spring缺省工厂类:org.springframework.beans.factory.support.DefaultListableBeanFactory使用其静态方法preInstantiateSingletons() 配置文件中最普通最基本的定义一个普通bean<bean id="DvdTypeDAOBean" class="com.machome.dvd.impl.DvdTypeDAO" >

曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析【上】)

写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean de

spring基于xml的声明式事务控制配置步骤

<?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:aop="http://www.springframework.org/schema/

Spring : 基于XML Schema的配置(一)

[本教程翻译自Spring官方文档,并有适当增删] (是针对Spring 4.0.6 Release版本的) 基于XML Schema的配置在Spring 2.0开始被引入,并在2.5和3.0版本得到增强和扩展. 转向基于XML Schema的动机是使得Spring XML配置更简单.传统的基于 <bean/>的方法是很好,但它的通用特性带来了很大的配置开销. 从Spring 依赖注入容器的观点来看,一切都是bean.这对Spring 容器是个好消息,因为如果一切都是bean,那么一对象都能以

duilib中加入自己定义控件之后怎么可以在xml文件里配置使用

加入自己定义控件可能有两种不同的情况: 1.  在duilib库中加入的自己定义控件. 2.  在我们的应用程序中自己重写了一个控件. 以下開始解说不同的情况下怎么才干支持在xml文件配置控件: 1.  库中情况 假如自己定义的控件是CGifUI类. 库中情况相对是比較简单的,仅仅需在分析xml文件时候将控件创建出来即可了,所以我找到的函数是CControlUI* CDialogBuilder::_Parse(CMarkupNode* pRoot, CControlUI* pParent, CP

曹工说Spring Boot源码(15)-- Spring从xml文件里到底得到了什么(context:load-time-weaver 完整解析)

写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean de

spring基于xml的声明式事务控制

配置文件bean.xml <?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:aop="http://www.springframework

Spring web.xml中的配置

转载博客:http://blog.163.com/zhangke_616/blog/static/191980492007994948206/ 在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制,自动加载的容器中去,在web项目中,配置文件加载到web容器中进行解析,目前,spring提供了两种加载器,以供web容器的加载:一种是ContextLoaderListener,另一种是ContextLoaderServlet.这两种在功能上