使用注解实现声明式事务
1.jar包
spring-tx-4.3.9.RELEASE
mysql-connector-java-5.1.47.jar
common-dbcp.jar 连接池使用数据源
common-pool.jar 连接池
spring-jdbc-4.3.9.RELEASE
aopalliance.jar
2.配置
增加事务tx的命名空间。
<!--配置数据库相关-事务-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="mysql://127.0.0.1:3306/springDB"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
<property name="maxActive" value="10"></property>
<property name="maxIdle" value="6"></property>
</bean>
<!--配置事务管理器txManager-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--增加对事务的支持-->
<tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>
3.使用
将需要成为事务的方法前增加注解。
@Transactional(readOnly = false,propagation = Propagation.REQUIRED)
面向切面编程——AOP

普通类——>特定功能的类:
(1)继承类(2)实现接口(3)注解(4)配置
通过接口实现aop
类——>“通知”:
实现接口。

前置通知实现步骤:
(1)jar:
aopalliance.jar
aspectjweaver.jar
(2)配置
<!--addStudent()所在的方法-->
<bean id="studentService" class="org.ghl.service.StudentServiceImpl">
<property name="studentDao" ref="studentDao"></property>
</bean>
<!--“前置通知”类-->
<!--======连接线的一方======-->
<bean id="logBefore" class="org.ghl.aop.LogBefore">
</bean>
<!--将addStudent()与通知相连-->
<aop:config>
<!--配置切入点(在哪里执行通知)-->
<!--=====连接线的另一方======-->
<aop:pointcut expression="execution(public void org.ghl.service.StudentServiceImpl.addStudent(org.ghl.entity.Student)) or execution
(public void org.ghl.service.StudentServiceImpl.deleteStudentByNo(int))" id="pointcut"></aop:pointcut>
<!--advisor相当于连接切入点和切面的线-->
<!--=======连接线=======-->
<aop:advisor advice-ref="logBefore" pointcut-ref="pointcut"/>
</aop:config>
(3)编写
实现接口: public class LogBefore implements MethodBeforeAdvice
表达式expression常见示例

后置通知实现步骤:
(1)通知类,实现接口
(2)业务类,业务方法
(3)将业务类、通知纳入springIOC容器;
定义切入点、定义通知类,通过pointcut-ref将两端连接起来。
异常通知实现步骤:
异常通知的实现类必须实现以下方法。
public void afterThrowing(Method method,Object[] args,Object target, Throwable ex){}
环绕通知实现步骤:
可以获得目标方法的全部控制权。
(1)通public class LogAround implements MethodInterceptor { @Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object result = null;
//方法体1
try {
//方法体2
System.out.println("用环绕实现【前置通知】...");
//invocation.proceed();前为前置通知
result=invocation.proceed();//控制目标方法的执行
//result就是目标方法addStudent()的返回值
//invocation.proceed();后为后置通知
System.out.println("用环绕实现【后置通知】...");
System.out.println("用环绕实现后置通知:目标对象:"+invocation.getThis()+",调用的方法名:"+invocation.getMethod().getName()+",方法的参数个数:"+
invocation.getArguments().length+",方法的返回值:"+result);
} catch (Exception ex) {
//方法体3
// 异常通知
System.out.println("用环绕实现【异常通知】...");
}
return result;
}
}
(2)业务类
(3)配置
使用环绕通知时,目标方法的一切信息可以通过innovation参数获取到。
环绕通知底层通过拦截器实现。
浙公网安备 33010602011771号