spring aop事务通知(切面异常处理)
2017-07-18 11:37
1261 查看
Spring Aop切面异常日志记录,本教程使用spring aop来记录service层所报出的异常记录,这样就可以很容易的知道我们项目的异常出现在哪个service方法中了,下面是spring aop异常切面的使用方法。 第一步:在我们的spring-context.xml中配置Aspectj自动代理,用于扫描我们自定义的异常处理切面类,代码如下。 <!-- 启用Aspectj自动代理 --> <aop:aspectj-autoproxy /> 第二步:自定义我们spring aop异常处理的切面类,由于上面的aop配置,系统会自动扫描我们@Aspect注解中所定义的方法。 /** * 切面类 * @author Anson */ @Component @Aspect public class AopThrowsAdvice { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private AopServiceComm aopServiceComm; //自定义service层 @Autowired private SqlSessionFactory sqlSessionFactory; /** *切面通知-执行前通知执行到了哪个方法 */ @Before("execution(* com.casking.cdds.modules.task.service.*.*(..))") public void beforeMethod(JoinPoint joinPoint) { Object object = joinPoint.getSignature(); String methodName = joinPoint.getSignature().getName(); List<Object> list = Arrays.asList(joinPoint.getArgs()); if (logger.isDebugEnabled()) { logger.debug("======================方法开始======================"); logger.debug(DateUtils.formatDateTime(new Date()) + "执行了【" + object + "方法开始执行......】"); } //自定义的方法保存日志信息,别在意 this.aopServiceComm.saveLogInfo(null,methodName,CommonVariate.TASK_SAVE_STARTONE); } /** *切面通知-异常通知 */ @AfterThrowing(value = "execution(* com.casking.cdds.modules.task.service.*.*(..))", throwing = "e") @Transactional(propagation=Propagation.NOT_SUPPORTED) public void afterThrowing(JoinPoint joinPoint, Exception e) { String methodName = joinPoint.getSignature().getName(); if (logger.isDebugEnabled()) { logger.info(methodName, e.toString() + "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<,"); } //自定义的service层,保存异常信息,别在意 this.aopServiceComm.saveLogInfo(e,methodName,CommonVariate.TASK_SAVE_STARTTWO); } } 上述事务切面表达式说明: - execution()是最常用的切点函数, - 整个表达式可以分为五个部分: 1、execution(): 表达式主体。 - 2、第一个*号:表示返回类型,*号表示所有的类型。 - 3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。 - 4、第二个*号:表示类名,*号表示所有的类。 - 5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。 第三步:在spring-context.xml中配置事务驱动,这个每个ssm或ssh项目都是差不多的,如果有请别重复配置了,稍微改下就可以了。 <!-- 配置Annotation驱动,扫描有@Transactional注解的类方法,并执行事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" order="5"/> <!-- 定义事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dynamicDataSource" /> </bean> 注意:异常事务是不能够被spring事务管理的,这里我写我踩过的坑,调低spring aop的执行顺序,order数字越小越靠前,可以在事务前执行异常记录sql。当事务管理数据源时会出现日志打印执行sql,如果不需要该方法执行事务,则可以手动去除事务,添加如下注解即可。 @Transactional(propagation=Propagation.NOT_SUPPORTED)
相关文章推荐
- 【spring】aop切面通知,日志处理
- Spring AOP 面向切面编程 常见通知实现(前置,后置,环绕,异常)
- Spring AOP切面实现:异常处理
- Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
- JAVAEE之Spring学习(三)---通过aop切面实现事务处理
- Intellij IDEA中Spring配置aop增强事务 出现BeanCreationException异常处理方法
- Spring-AOP-通知-异常通知
- Spring.Net AOP 学习之旅: 使用 Throws Advice 处理异常
- Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)
- 一个用Spring AOP实现异常处理和记录程序执行时间的实例(二)
- Spring初学之xml实现AOP前置通知、后置通知、返回通知、异常通知等
- Spring事务处理及其AOP框架的内幕
- 使用SpringAOP 处理异常
- Spring的AOP事务管理默认针对unchecked异常回滚
- 一个用Spring AOP实现异常处理和记录程序执行时间的实例--邵京国
- Spring的事务处理机制及JAVA异常
- AOP应用实例--Spring事务处理及其AOP框架的内幕 选择自 jwsh1984 的 Blog
- java基于spring注解AOP的异常处理的方法
- AOP的一些东西(事务的传播特性,前置,后置,环绕,异常 等各种通知)
- Spring2.5版本下的事务异常处理机制