目录
  • springboot aop切到service层,不生效
    • 发现一个问题
  • spring中aop无法拦截service层内部方法调用
    • 问题描述
    • 解决方法
  • 总结

    springboot aop切到service层,不生效

    发现一个问题

    使用aop切到service层方法上,idea会有切成功的标志,编译也不报错,但就是不生效。

    研究了下发现,是因为我切的方法被同一个service中的其他方法调用,这样的话就不生效了,原因是切面只能对被spring代理的对象起作用,自己调用不行,解决方法是切到spring代理的方法上,这只是切点不生效的一种情况,给到大家参考。

    AOP文件:

        //注释掉的是原来不生效的方式
        //@AfterReturning("execution( * cn.qdcares.fodmonitor.web.api.fodmonitor.fodtask.service.impl.FodTaskServiceImpl.radarSubmitFodTask(..))")
        @AfterReturning("execution( * cn.qdcares.fodmonitor.web.api.fodmonitor.fodtask.service.impl.FodTaskServiceImpl.refreshRadarFodTask(..))")
        public void createFodAfterReturning(JoinPoint joinPoint){
    

    service文件二者关系:

        //切到这里生效
        @Override
        public int refreshRadarFodTask(RadarFod radarFod) {
            //判断数据库中是否存在数据
            //从而进行新增或更新操作
            Optional<FodTask> optional = fodTaskRepository.findByFodId(radarFod.getId());
            if (optional.isPresent()){
                updateFodTaskByFodId(radarFod);
                return 1;
            }
            radarSubmitFodTask(radarFod);
            return 1;
    
        }
        //切到这里不生效	
        @Override
        public int radarSubmitFodTask(RadarFod radarFod) {
     
            return 1;
        }
    

    spring中aop无法拦截service层内部方法调用

    问题描述

    在service类中有个a方法调用内部b方法时,无法拦截到b方法。

    示例:

    例如如下示例代码,当访问controller的hello方法时,无法拦截service层testA方法中调用到的内部testB方法。

    package com.example.test.controller;
    import com.example.test.service.Service;
     
     
    ================================================controller层========
    @RestController
    public class TestController{
     
    	@Autowired
    	Service service;
    	
    	@RequestMapping("")
    	public void hello(String name)
    	{
    		service.testA(name);
    	}
    }
     
    ================================================Service层========
    package com.example.test.service;
    public class Service{
    	public void testA(String name);
    }
     
    ================================================Service实现类========
    package com.example.test.service.impl;
     
     public class ServiceImpl impl Service{
        @Override
        @Transactional
        public void testA(String name) {
    		
    		testB(name);
    	}
    	
    	public void testB(String name){
    	
    	}
     
    }
    ==========================ASPECT=============
    @Component
    @Aspect
    @Order(1)
    public class ServiceAspect {
     
     
        @Before("execution(* com.example.test..*.testA(..))")
        public void approve(JoinPoint joinPoint)
        {
            Object[] args = joinPoint.getArgs();
     
        }
    }

    解决方法

    1.修改Service层的testA方法:

    package com.example.test.service.impl;
     
     public class ServiceImpl impl Service{
        @Override
        @Transactional
        public void testA(String name) {
    		
         ServiceImpl service = AopContext.currentProxy() != null 
                                      ? (ServiceImpl)AopContext.currentProxy() : this;
    		service.testB(name);
    	}
    	
    	public void testB(String name){
            System.out.println(name);
    	
    	}
     
    }

    2.在springboot启动类上开启aop代理

    @EnableAspectJAutoProxy(exposeProxy = true)

    3.重新启动后,aop就能拦截到testB方法。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。