spring aop内部方法调用无效修改

2019-01-21  本文已影响0人  wei_lu_lu

有如下aop处理类和service方法:

AOP处理类

@Service
@Aspect
public class AopHandler {

    private static final String executionSring = "execution(* com.wl.study.aop.AopServiceImpl.test())";

    @Around(executionSring)
    public void handle(ProceedingJoinPoint point)throws Throwable{
        System.out.println(1);
        point.proceed();
        System.out.println(2);
    }
}

需要处理的service

@Service
public class AopServiceImpl implements AopService {

    @Override
    public void call(){
        System.out.println("start call");
        //通过AopContext获取AopService对象
        AopService aopService = (AopService)AopContext.currentProxy();
        //通过aopService对象进行调用
        aopService.test();
    }

    @Override
    public void testCall(){
        //在这里直接调test方法,aop是不会生效的,正确的方法应该像call那样:先
        //获取AopContext,然后转成AopService,使用aopService进行调用,注意在获取AopContext
        //的时候,配置文件里的expose-proxy="true"记得上
        test();
    }
    @Override
    public void test(){
        System.out.println("aop test");
    }
}

调用入口:

public class Test {

    public static void main(String[] args){
        ClassPathXmlApplicationContext applicationContext = getContext();
        AopService aopService = applicationContext.getBean(AopService.class);
        //aopService.test();
        aopService.call();
    }

    public static ClassPathXmlApplicationContext getContext(){
        return new ClassPathXmlApplicationContext("aop.xml");
    }
}

在切面处理中会对AopService 接口中的test()方法进行拦截处理,
在testCall方法里直接调用test,切面是不会起作用的。而在call方法里先获取AopContext对象,转成AopService之后,再调用则切面生效。
另外,配置文件还有个地方需要注意下,需要加上expose-proxy="true",这样才能拿到AopContext

<aop:aspectj-autoproxy expose-proxy="true"></aop:aspectj-autoproxy>
<context:component-scan base-package="com.wl.study"></context:component-scan>
上一篇下一篇

猜你喜欢

热点阅读