美文网首页
spring aop内部方法调用无效修改

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

作者: wei_lu_lu | 来源:发表于2019-01-21 20:16 被阅读0次

    有如下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>
    

    相关文章

      网友评论

          本文标题:spring aop内部方法调用无效修改

          本文链接:https://www.haomeiwen.com/subject/sedhjqtx.html