当前位置:首页>编程知识库>后端开发知识>面试官:Spring AOP有哪些通知类型,它们的执行顺序是怎样的?
面试官:Spring AOP有哪些通知类型,它们的执行顺序是怎样的?
阅读 1
2021-03-12

前言

这篇比较简单,但是群友反馈面试被问到了,关键还没答出来,而且还是项目中用的比较多的技术点。还是要在平时开发中有一丢丢好奇心,多点进去看看代码啊!

通知类型

在基于Spring AOP编程的过程中,基于AspectJ框架标准,spring中定义了五种类型的通知,它们分别是:

前置通知 (@Before) 。

返回通知 (@AfterReturning) 。

异常通知 (@AfterThrowing) 。

后置通知 (@After)。

环绕通知 (@Around) :(优先级最高)

通知执行顺序

将上面的所有通知类型写入同一个切面中,它的执行顺序为:

代码展示

package com.cy.pj.common.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SysTimeAspect {

 /**
  * 切入点
  */
 @Pointcut("bean(sysMenuServiceImpl)")
 public void doTime(){}

 @Before("doTime()")
 public void doBefore(JoinPoint jp){
  System.out.println("time doBefore()");
 }
 @After("doTime()")
 public void doAfter(){//类似于finally{}代码块
  System.out.println("time doAfter()");
 }
 /**核心业务正常结束时执行
  * 说明:假如有after,先执行after,再执行returning*/
 @AfterReturning("doTime()")
 public void doAfterReturning(){
  System.out.println("time doAfterReturning");
 }
 /**核心业务出现异常时执行
  * 说明:假如有after,先执行after,再执行Throwing*/
 @AfterThrowing("doTime()")
 public void doAfterThrowing(){
  System.out.println("time doAfterThrowing");
 }
 @Around("doTime()")
 public Object doAround(ProceedingJoinPoint jp)
   throws Throwable{
  System.out.println("doAround.before");
  try {
  Object obj=jp.proceed();
  return obj;
  }catch(Throwable e) {
  System.out.println("doAround.error-->" e.getMessage());
  throw e;
  }finally {
  System.out.println("doAround.after");
  }
 }

}

代码正常结束

代码出现异常



作者:其乐m
来源:my.oschina.net/u/4115134/blog/3216359

 
  END
 


 十期推荐
 【231期】面试官:Java中 serialVersionUID 的作用是什么?

 【232期】面试官:Spring的 IOC 容器比New对象究竟好在哪?

 【233期】面试官:什么是耦合?解耦合的方法有哪几种?

 【234期】30个 Java 集合面试必备的问题和答案

 【235期】面试官:Redis的数据是存在内存里吗?谈谈Redis各种数据类型的使用场景?

 【236期】面试官:线程池中多余的线程是如何回收的?

 【237期】面试官:如何发现 Redis 热点 Key ,解决方案有哪些?

 【238期】面试官:Redis新版本开始引入多线程,谈谈你的看法?

 【239期】面试官:如何使用Redis实现电商系统的库存扣减?

 【240期】面试官:你了解JVM的内存溢出吗?
 

? ~
以上数据来源于网络,如有侵权,请联系删除。
评论 (0)