基于注解的事务管理配置文件:
(用 切面类 去模拟的)
<context:component-scan base-package="com.yidongxueyuan"></context:component-scan>
<!-- 采用注解的方式 ,支持注解形式的aop配置-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- 开启一个扫描属性上的注解-->
<context:annotation-config/>
<!-- 配置外置的数据源: -->
<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>
<!-- xml 开发 -->
<bean id="accountDao" class="com.yidongxueyuan.spring.dao.impl.AccountDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
切面类的代码如下:
package com.yidongxueyuan.spring.utils;
import java.sql.Connection;
import java.sql.SQLException;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component("TransactionManager")
//告知spring该类是一个切面类
@Aspect
/**
* 定义和事务相关的所有的方法:
* 事物的开启
*/
//设置一个通用的切点表达式
public class TransactionManager {
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
public static Connection getConnection(){
Connection conn = tl.get();
if(conn == null){
conn = C3P0Util.getConnection();
tl.set(conn);
}
return conn;
}
@Pointcut(value="execution( * com.yidongxueyuan.spring.service.impl.AccountServiceImpl.*(..))")
private void point1(){}
@Before(value="point1()")
public static void startTransaction(){
try {
Connection conn = getConnection();
conn.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
@AfterReturning(value="point1()")
public static void commit(){
try {
Connection conn = getConnection();
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
@AfterThrowing(value="point1()",throwing="e")
public static void rollback(){
try {
Connection conn = getConnection();
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
//释放链接:
public static void release() {
Connection conn = getConnection();
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}