SpringBoot AOP无法拦截类内部的调用方法

问题描述:
类A中有个方法B,方法B去调用类A中的另一个方法C,现在想用aop去拦截这个C方法,发现无法拦截。
由于博主学术不精,钻研的不深,说不太清楚为什么,反正是一些关于底层代理的问题。这里就直接给出解决方法。
1.改变调用C方法的写法:

`
// handlerApConfigMod(msg_json);//原来是直接调用另一个方法,改为下面这种写法

((AcUpdataHandler) AopContext.currentProxy()).handlerApConfigMod(msg_json);//AcUpdataHandler是当前类名
`

2.SpringBoot启动类中加一个注解
@EnableAspectJAutoProxy(exposeProxy = true)
这样就可以解决问题了。
原文链接:Spring AOP无法拦截内部方法调用

https://www.jianshu.com/p/6534945eb3b5

 

 

Spring使用的AOP注解分为三个层次:

前提条件是在xml中放开了

@Aspect放在类头上,把这个类作为一个切面。

 @Pointcut放在方法头上,定义一个可被别的方法引用的切入点表达式。

5种通知。

@Before,前置通知,放在方法头上。

@After,后置【finally】通知,放在方法头上。

@AfterReturning,后置【try】通知,放在方法头上,使用returning来引用方法返回值。

@AfterThrowing,后置【catch】通知,放在方法头上,使用throwing来引用抛出的异常。

@Around,环绕通知,放在方法头上,这个方法要决定真实的方法是否执行,而且必须有返回值。

 

@Component  

@Aspect  

public class LogAspect {  

 

/** 

* 定义Pointcut,Pointcut的名称 就是simplePointcut,此方法不能有返回值,该方法只是一个标示 

 */  

 @Pointcut("execution(public * com.service.impl..*.*(..))")  

public void recordLog() {  

 }  

 

@AfterReturning(pointcut = "recordLog()")  

public void simpleAdvice() {  

 LogUtil.info("AOP后处理成功 ");  

}  

 

@Around("recordLog()")  

public Object aroundLogCalls(ProceedingJoinPoint jp) throws Throwable {  

 LogUtil.info("正常运行");  

return jp.proceed();  

 }  

 

@Before("recordLog()")  

public void before(JoinPoint jp) {  

 String className = jp.getThis().toString();  

String methodName = jp.getSignature().getName(); // 获得方法名  

LogUtil.info("位于:" + className + "调用" + methodName + "()方法-开始!");  

Object[] args = jp.getArgs(); // 获得参数列表  

 if (args.length <= 0) {  

 LogUtil.info("====" + methodName + "方法没有参数");  

 } else {  

 for (int i = 0; i < args.length; i++) {  

 LogUtil.info("====参数  " + (i + 1) + ":" + args[i]);  

}  

 }  

LogUtil.info("=====================================");  

}  

 

 @AfterThrowing("recordLog()")  

 public void catchInfo() {  

 LogUtil.info("异常信息");  

 }  

 

@After("recordLog()")  

 public void after(JoinPoint jp) {  

 LogUtil.info("" + jp.getSignature().getName() + "()方法-结束!");  

 LogUtil.info("=====================================");  

}  

}  

 

 

博主强烈推荐:https://blog.csdn.net/persistencegoing/article/details/84376427

希望大家关注我一波,防止以后迷路,有需要的可以加群讨论互相学习java ,学习路线探讨,经验分享与java求职  

群号:721 515 304

你可能感兴趣的:(java基础)