/**
* 【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;
* }
*/