信步漫谈之自定义AOP注释


1 目标

  • 自定义注释的AOP实现

2 AOP基本概念

  • Aspect 【切面】:通常是一个类,里面可以定义切入点和通知;
  • JointPoint 【连接点】:程序执行过程中明确的点,一般是方法的调用;
  • Advice 【通知】:AOP在特定的切入点上执行的增强的处理,有before/after/around/afterRetuing/afterThrowing;
  • PointCut (切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式。
  • Excution 表达式:定义切入点规则,多个方法形成一个切面;
  • AOP主要作用:使业务和功能代码解耦,进行无侵入性的代码增强

3 AOP之Execution表达式解释

例:execution(* .(..))

  • 第一个*:代表的是方法返回的类型
  • 第二个*:代表扫描的包路径;
  • 第三个*:包路径下的方法名,(..)代表方法的参数;
@Around("@annotation(com.king..LogAspect)")                                 //容器中加了LogAspect注解的类才拦截;
@Before("execution(public int com.king.aop.Calc.div(int,int))")             //拦截div(intent)方法,返回参数是int;
@Before("execution(public int com.king.aop.Calc.*(..))")                    //拦截包下的所有的方法;
@Around("execution(public int com.king.aop.Calc.*(..)) && @annotation(log)")  //将注解 DoSomething作为一个参数传递进来

4 AOP注释执行顺序

try
{
     1、 环绕前置通知;@Around 
     2、 前置通知;   @Before      
     3、 执行目标方法; method.invoke()
     4、 环绕后置通知;@Around
     5、 执行返回通知;@After
}catche(Exception e){
     5.1、执行异常通知;@AfterThrowing  没有异常不打印,有异常替换@After
}finally{
     6、执行后置通知;@AfterReturning
}

5 知识池

  • 如果要确定两个切面的执行顺序,可以给aspect添加@Order注解,值越小优先级越高。
  • JoinPoint 和 ProceedingJoinPoint的关系
    • ProceedingJoinPoint 只能在@Around中使用
    • JoinPoint也可以获取入参(getArgs()),它可以用于@Before 和 @AfterReturning
    • Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础上暴露出 proceed 这个方法
  • @Around如果不执行proceed(),那么原方法将不会执行

6 源码

https://gitee.com/alfredinchange/java-developer.git 下 com.alfred.java.customannotationaop

7 参考资料(感谢)

Spring的AOP流程

posted @ 2024-11-12 19:52  临渊启明  阅读(2)  评论(0编辑  收藏  举报