[emailprotected]切点调用不到嵌套方法分析

作者:神秘网友 发布时间:2020-09-08 11:23:02

[emailprotected]切点调用不到嵌套方法分析

[email protected]切点调用不到嵌套方法分析
package spring.pointcut;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;


@Aspect
public class TargetMonitor {

    // 配置方法1
	// @Pointcut("execution(* spring.pointcut.Target.onEvent(java.util.Map))")
	// private void anyMethod() {}
	// @Around("anyMethod()")

    //配置方法2
    @Around("execution(* spring.pointcut.Target.onEvent(..))")
    public Object monitor(ProceedingJoinPoint point) throws Throwable {
        System.out.println("before");
        try {
            return point.proceed();
        } finally {
            System.out.println("after");
        }
    }
}
public class Target {

    public void otherEvent(){
        System.out.println("Call otherEvent()");
    }

    public boolean onEvent(Integer type, Long Value){
        System.out.println("Call onEvent(Integer type, Long Value)");
        for (int i=0; i<=3; i++){
            this.onEvent(new HashMap());
        }
        System.out.println("End Call onEvent(Integer type, Long Value)");
        return true;
    }

    public boolean onEvent(Map type){
        System.out.println("Call onEvent(Map type)");
        return true;
    }
}

此时会发现aop只能切入onEvent(Integer type, Long Value)这个方法,这个方法里面调用的onEvent(Map type)无法代理到.

这是因为切点方法当且仅当在类执行入口时才能被调用,而非类内部的其他接口调用.其实说白了就是调用onEvent(Map type)时没有走代理类的invoke或者intercept方法,所以导致aop的切点没有代理到方法.

进一步分析是因为代理类在执行invoke或者intercept方法也就是目标类的对应方法的时候时候,这个时候执行的是目标类(被代理类的)真实业务方法,在这个方法里调用的this.onEvent方法是没有被代理的

解决方法:

只需要使用spring容器中的bean的方法就可以了,因为aop代理的是spring的bean.只要走的是代理对象的方法,那么aop就都可以代理
[emailprotected]切点调用不到嵌套方法分析

参考了大佬的博客
https://www.cnblogs.com/do-your-best/p/9839846.html

[emailprotected]切点调用不到嵌套方法分析相关教程

  1. 时间数据的特征工程
  2. Android Listview多次调用addHeaderView和addFooterView
  3. Swift中利用AppDelegate实现调用指定ViewController中的函数
  4. C#调用python
  5. 调用scanner.close()报错Java.io.Exception: Stream closed; 的
  6. 通过jni调用OpenCv跟直接调用android版openCv对图片进行简单的变
  7. ASP.net 调用服务问题
  8. Android 调用第三方地图类App (高德 百度 百度网页版)