springboot aop切到service层,不生效问题
作者:大喵快跑
这篇文章主要介绍了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方法。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。