AOP详解-AOP概览

138 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

AOP中的相关概念

接下来就来讲解一下AOP中的相关概念,了解了AOP中的概念,才能真正的掌握AOP的精髓。这里还是先给出概念定义:

  • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
  • Target(目标对象):织入 Advice 的目标对象.。 Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

增强方式

增强的类型有前置增强、后置返回增强、异常增强、环绕增强、引介增强、后置最终增强等

MethodBeforeAdvice前置增强

前置增强MethodBeforeAdvice :

    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("==前置增强");
        System.out.println("==方法名:" + method.getName());
        if (null != args && args.length > 0) {
            for (int i = 0; i < args.length; i++) {
                System.out.println("==第" + (i + 1) + "参数:" + args[i]);
            }
        }
        System.out.println("==目标类信息:" + target.toString());
    }
    

AfterReturningAdvice后置增强

  
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("==后置增强");
        System.out.println("==方法名:" + method.getName());
        if (null != args && args.length > 0) {
            for (int i = 0; i < args.length; i++) {
                System.out.println("==第" + (i + 1) + "参数:" + args[i]);
            }
        }
        System.out.println("==目标类信息:" + target.toString());
    }
    

ThrowsAdvice异常增强

   public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {
       System.out.println("==异常增强");
       System.out.println("==方法名:" + method.getName());
       if (null != args && args.length > 0) {
           for (int i = 0; i < args.length; i++) {
               System.out.println("==第" + (i + 1) + "参数:" + args[i]);
           }
       }
       System.out.println("==目标类信息:" + target.toString());
       System.out.println("==异常信息:" + ex.toString());
   }

MethodInterceptor环绕增强

      public Object invoke(MethodInvocation invocation) throws Throwable {
       System.out.println("==环绕增强开始");
       System.out.println("==方法名:" + invocation.getMethod().getName());
       Object[] args = invocation.getArguments();
       if (null != args && args.length > 0) {
           for (int i = 0; i < args.length; i++) {
               System.out.println("==第" + (i + 1) + "参数:" + args[i]);
           }
       }

       Object proceed = invocation.proceed();

       System.out.println("==环绕增强结束");
       return proceed;
   }

 总结

以上简单介绍了前置增强、后置增强、环绕增强、异常增强等以编码实现的方式,当然以上实现也可以通过配置文件的方式实现。

本篇介绍的知识点比较简单,但是理解增强的概念是AOP的基础,AOP其本质还是JDK或CGLIB动态代理,之后会讲解到JDK和CGLIB动态代理,本篇的分析就到这里了。

掘友们,如果觉得有用就留下个赞或评论再走吧!谢啦~ 💐