AspectJ---初识

 

/**
     *  【AspectJ】
     *      Eclipse基金组织的开源项目;
     *      面向切面的框架,AOP实现之一;
     *      扩展了Java语言;
     *      定义了AOP语法;
     *      有一个专门的 编译器 生成遵守Java字节码规范的class文件;
     *
     *      向Java中 加入了 连接点JoinPoint、切入点pointcut、通知advice、类型间声明inter-type declaration、切面aspect;
     *          切点 和 通知:
     *              动态影响程序的流程;
     *          类型间声明:
     *              静态的影响程序的类等级结构;
     *          切面:
     *              对所有新结构的封装;
     *
     *      连接点JoinPoint:
     *          程序流中的指定的一点(被拦截到的点,如 方法、字段、构造器...);
     *      切入点pointcut:
     *          收集 特定的连接点集合 和 在这些连接点中的值;
     *      通知advice:
     *          当一个连接点到达时 执行的代码;
     *
     *      AspectJ 与 Spring AOP区别:
     *          AspectJ:
     *              在编译时 进行增强,有个专门的编译器 生成class文件;
     *          Spring AOP:
     *              动态代理
     *
     *      切入点表达式execution语法:
     *          表达式分为5个部分:
     *              第一部分:
     *                  修饰符(可选)
     *              第二个部分:
     *                  表示返回值类型,*表示所有类型;
     *              第三部分:
     *                  方法名
     *              第四部分:
     *                  参数
     *              第五部分:
     *                  异常(可选)
     *
     *
     *      call:代表调用方法的位置,插入在函数体外面。
     *      execution:代表方法执行的位置,插入在函数体内部。
     *
     */

  

/**
     * 【AspectJ---JoinPoint】
     *      org.aspectj.lang.JoinPoint
     *
     *          Provides reflective access to both the state available at a join point and static information about it.
     *          提供 对一个 joinPoint可用状态 和 有关连接点的静态信息的 反射访问。
     *
     *          public interface JoinPoint {
     *
     *              String METHOD_EXECUTION = "method-execution";
     *              String METHOD_CALL = "method-call";
     *              String CONSTRUCTOR_EXECUTION = "constructor-execution";
     *              String CONSTRUCTOR_CALL = "constructor-call";
     *              String FIELD_GET = "field-get";
     *              String FIELD_SET = "field-set";
     *              String STATICINITIALIZATION = "staticinitialization";
     *              String PREINITIALIZATION = "preinitialization";
     *              String INITIALIZATION = "initialization";
     *              String EXCEPTION_HANDLER = "exception-handler";
     *              String SYNCHRONIZATION_LOCK = "lock";
     *              String SYNCHRONIZATION_UNLOCK = "unlock";
     *              String ADVICE_EXECUTION = "adviceexecution";
     *
     *              String toString();
     *              String toShortString();
     *              String toLongString();
     *              Object getThis();
     *              Object getTarget();
     *              Object[] getArgs();
     *              Signature getSignature();
     *              String getKind();
     *          }
     *
     *     JoinPoint常用方法
     *
     *     @After("execution(* com.an.controller.MyController.testTranscation(String))")
     *     public void after(JoinPoint joinPoint) {
     *         System.out.println("toString: "+ joinPoint.toString()); // execution(void com.an.controller.MyController.testTranscation(String))
     *         System.out.println("toShortString: "+ joinPoint.toShortString()); // execution(MyController.testTranscation(..))
     *         System.out.println("toLongString: "+ joinPoint.toLongString()); // execution( void com.an.controller.MyController.testTranscation(java.lang.String))
     *
     *         Object joinPointThis = joinPoint.getThis();
     *         System.out.println(joinPointThis); // com.an.controller.MyController@77ac34a0
     *         System.out.println(joinPointThis.getClass().getSimpleName()); // MyController$$EnhancerBySpringCGLIB$$9724b0f9
     *
     *         Object joinPointTarget = joinPoint.getTarget();
     *         System.out.println(joinPointTarget); // com.an.controller.MyController@77ac34a0
     *         System.out.println(joinPointTarget.getClass().getSimpleName()); // MyController
     *
     *         Object[] args = joinPoint.getArgs();
     *         System.out.println(Arrays.toString(args)); // [m]
     *
     *         String joinPointKind = joinPoint.getKind();
     *         System.out.println(joinPointKind); // method-execution
     *
     *         Signature joinPointSignature = joinPoint.getSignature();
     *         System.out.println(joinPointSignature.getName()); // testTranscation
     *         System.out.println(joinPointSignature.getDeclaringType()); // class com.an.controller.MyController
     *         System.out.println(joinPointSignature.getDeclaringTypeName()); // com.an.controller.MyController
     *         System.out.println(joinPointSignature.getModifiers()); // 0
     *
     *     }
     *
     *
     *     org.aspectj.lang.ProceedingJoinPoint
     *          ProceedingJoinPoint exposes the proceed(..) method in order to support around advice in @AJ aspects.
     *          ProceedingJoinPoint为了支持 around advice 提供了 proceed方法;
     *
     *          public interface ProceedingJoinPoint extends JoinPoint {
     *
     *              // Proceed with the next advice or target method invocation. 继续下一个advice 或者 目标方法调用;
     *              Object proceed() throws Throwable;
     *
     *              //
     *              Object proceed(Object[] args) throws Throwable;
     *          }
     */

  

posted on 2022-03-16 16:49  anpeiyong  阅读(25)  评论(0编辑  收藏  举报

导航