Java内部方法调用怎么切面,Spring AOP,怎么获得切面的调用者?

经过和题主评论询问,才总算把这个问题真正展示出来了,不然的话,大家都会围绕这foobar的切面去想

而你的问题或者说你现在实现的一个新业务,最重要的地方其实应该是:

如何处理调用foobar的方法

也就是说,你这个新业务其实就是处理某些调用foobar的方法的定制化,而直接分析一下就可以发现你这个新业务中需要处理或者像你说的加注解的方法它们唯一相同点是内部调用了foobar。

所以它们既是分散的,但是内部却有相同想要统一实现的业务。分散但有需要统一处理的情况我们一般咋做啊,没错,就是切面啊~哈哈哈(想想怎么所有Controller方法打印日志,做事务管理等)。因此这里理应来说其实就有2个切面。

那真正重要的切面地方其实是去切调用了foobar的方法,也就是你说A method,B method等。切入点也很简单,就是注解咯。

那切面做啥,很简单,就是你想要做的业务,即通知接下来调用foobar时需要打印消耗时间,这个通知咋通知,不额外添加其他修改的情况下就是ThreadLocal咯。那可能写出来就是如下效果@Around(value = "pointcut(xxxAnotation)")

public Object around(ProceedingJoinPoint joinPoint, XXXAnotation xxxAnotation) {

// TODO 在ThreadLocal中塞入Flag,

// 当然你可以从注解xxxAnotation中获取你的配置信息,决定是否要塞入Flag

// 执行方法(这里面执行的时候就会去调用foobar)

Object result = joinPoint.proceed();

// TODO 在ThreadLocal中清除Flag

}

好了,这里Flag处理完了,再回到foobar的切面里,这里就很简单啦,直接获取Flag,然后决定是否要打印消耗时间咯。

综上,其实也许处理问题的观察点切换一下,没准问题反而好解决了(但是描述问题不完整,大家不太容易能想到还要做个切面),最终解决的效果看起来也不是很别扭,也算是很优雅了叭,对以前代码的修改也只是增加了注解,其他地方都是新增代码,但是这也是这个新业务必须的地方,毕竟这个新业务就要去明确调用foobar的方法,明确的话就一定需要标注了(无论通过什么形式)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值