springboot aop切到service层,不生效问题

 更新时间:2024年05月10日 11:43:06   作者:大喵快跑  
这篇文章主要介绍了springboot 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方法。

总结

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

相关文章

  • springmvc+mybatis 做分页sql 语句实例代码

    springmvc+mybatis 做分页sql 语句实例代码

    本文通过一段实例代码给大家介绍了springmvc+mybatis 做分页sql 语句的方法,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-07-07
  • Java实现的简单数字时钟功能示例

    Java实现的简单数字时钟功能示例

    这篇文章主要介绍了Java实现的简单数字时钟功能,涉及java日期时间及JFrame框架图形界面操作相关实现技巧,需要的朋友可以参考下
    2019-02-02
  • springboot项目关闭swagger如何防止漏洞扫描

    springboot项目关闭swagger如何防止漏洞扫描

    这篇文章主要介绍了springboot项目关闭swagger如何防止漏洞扫描,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Java并发编程创建并运行线程的方法对比

    Java并发编程创建并运行线程的方法对比

    这篇文章主要为大家详细介绍了Java并发编程创建并运行线程的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • SpringBoot实现HTTP调用的七种方式总结

    SpringBoot实现HTTP调用的七种方式总结

    小编在工作中,遇到一些需要调用三方接口的任务,就需要用到 HTTP 调用工具,这里,我总结了一下 实现 HTTP 调用的方式,共有 7 种(后续会继续新增),需要的朋友可以参考下
    2023-09-09
  • SpringBoot整合ShardingSphere的示例代码

    SpringBoot整合ShardingSphere的示例代码

    本文主要介绍了SpringBoot整合ShardingSphere的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java String保存字符串的机制

    Java String保存字符串的机制

    Java中字符串以什么格式来存储?Java 中的 Unicode 字符串会按照 Latin1或者 UTF16 的编码格式保存在 String 中,本文就详细的介绍了一下,感兴趣的可以了解一下
    2021-05-05
  • java中的过滤器 Filter应用小结

    java中的过滤器 Filter应用小结

    文章主要介绍了Java Web中的过滤器(Filter)的基本概念、生命周期、配置和应用,过滤器可以拦截请求和响应,用于执行一些预处理或后处理操作,如设置编码、校验用户身份等,感兴趣的朋友一起看看吧
    2025-03-03
  • SpringBoot中OKHttp和压缩文件的使用实战教程

    SpringBoot中OKHttp和压缩文件的使用实战教程

    本文介绍了如何在SpringBoot中使用OKHttp发起请求和处理压缩文件,包括文件的存储配置、实体类、配置类和初始化类的设置,以及如何通过主程序和测试类进行实际操作,最后提供了必要的依赖添加方法,以确保功能的实现
    2024-10-10
  • 重启Jenkins的三种方式及注意事项

    重启Jenkins的三种方式及注意事项

    Jenkins是一款广泛使用的持续集成工具,它允许开发者自动化构建、测试和部署软件,这篇文章主要介绍了重启Jenkins的三种方式及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03

最新评论