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