基于xml
<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">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///customer"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="accoutDao" class="com.yidongxueyuan.spring.dao.impl.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="accoutService" class="com.yidongxueyuan.spring.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accoutDao"></property>
</bean>
<!-- spring 基于xml的形式管理事务: -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 定义通知: -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" isolation="DEFAULT" read-only="true" timeout="-1" propagation="REQUIRED" />
<tx:method name="query*" isolation="DEFAULT" read-only="true" timeout="-1" propagation="REQUIRED"/>
<tx:method name="select*" isolation="DEFAULT" read-only="true" timeout="-1" propagation="REQUIRED"/>
<tx:method name="load*" isolation="DEFAULT" read-only="true" timeout="-1" propagation="REQUIRED"/>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- aop的配置: -->
<aop:config>
<!-- 切点: -->
<aop:pointcut expression="execution (* com.yidongxueyuan.spring.service.impl.*.*(..))" id="point1"/>
<!-- 定义切点和通知的关系: -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="point1"/>
</aop:config>
</beans>
然后在类上面要提供set,get方法,不然底层反射不能自动创建对象,
然后在service层上面 打个标签就完事了。
但是 不能 extends
基于注解的开发
xml配置
<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:component-scan base-package="com.yidongxueyuan"></context:component-scan>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///customer"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务的管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 采用注解管理事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
service层引用:
package com.yidongxueyuan.spring.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.yidongxueyuan.spring.dao.AccountDao;
import com.yidongxueyuan.spring.pojo.Account;
import com.yidongxueyuan.spring.service.AccountService;
@Service("accountService")
@Transactional(propagation= Propagation.REQUIRED,
isolation=Isolation.DEFAULT,readOnly=false) //加入了类上, 表示所有的方法都支持事务:
public class AccountServiceImpl implements AccountService{
//已入了dao层:
@Autowired
private AccountDao accountDao;
public AccountDao getAccountDao() {
return accountDao;
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
// @Transactional 注解可以应用在方法上,应用在方法上, 表示该方法加入了事务的支持。
@Override
public void transfer(String sourceAccount, String targetAccout, float money) {
//根据来源账户:
Account sourceAcc = accountDao.findAccountByName(sourceAccount);//aaa
//查询目标账户:
Account targetAcc = accountDao.findAccountByName(targetAccout);// ccc
//来源账户减钱
sourceAcc.setMoney(sourceAcc.getMoney()-money);
//目标账户增钱:
targetAcc.setMoney(targetAcc.getMoney()+money);
//调用dao层的方法: 将变化后的数据保存哎数据库当中:
accountDao.updateAccount(sourceAcc);
//模拟异常的发生:
int i=1/0;
accountDao.updateAccount(targetAcc);
}
@Transactional(propagation= Propagation.REQUIRED,
isolation=Isolation.DEFAULT,readOnly=true)
public void find(){
}
}