spring中aop拦截自定义注解不生效
前言
文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Java菜鸟学习群,群聊号码:549684836 鼓励大家在技术的路上写博客
絮叨
最近小六六自己在项目中遇到的一些真实经历,记录起来关于aop的一些记录
AOP
面向切面编程,Spring AOP 的存在是为了解耦, AOP 可以让一组类共享相同的行为.在 OOP 只能通过继承类和实现接口,来使代码的耦合度增加,且类集成只能为单继承,阻碍更多行为添加到同一类上, AOP 弥补了 OOP 的不足.
Spring 支持 AspectJ 的注解式切面编程.
- 使用 @AspectJ 声明一个切面
- 使用 @After 、@Before、@Around 定义建言(advice), 可直接将拦截规则(切点)作为参数.
- 其中 @After 、@Before、@Around参数的拦截规则为切点(PointCut), 为了使切点复用,可使用 @PointCut 专门定义拦截规则,然后 @After 、@Before、@Around 的参数中调用.
- 其中符合条件的每一个被拦截处为连接点( JoinPoint)
其实具体来说用法也是很简单的,如下是小六六自己写的代码


但是当我去使用的时候发下了一些问题,
- 第一个 我在FeignClient里面使用了这个自定义注解,类似于如下图

但是我发现一个问题,这样子做,虽然可以走我们的切面成功,但是切面中获取自定义注解的参数的时候,一直为null.这个就很恼火了,如下

为啥会为空呢?原来是因为@FeignClient 这个注解Spring 做了增强,那么你切面的时候,已经是代理类了,所以就拿不到这个内容呢?我去还有这种玩法,行,那我们就换一个玩法,


小六六就想了个办法,我抽取一个方法出来,这样子 我再另外一个方法再去切面,这样就可以完成了,哈哈 ,我想完美。然而事实并非如此,最后竟然连切面都进不去了。fuck 这个是什么原因呢?
原因分析
其实上面的原因其实很简单,因为我抽取的那个方法用了this,this代表了当前对象,那么我们来看看当前对象是啥就知道了 Controller的

ServiceImp

很明显了,当前对象是Java对象,而调用的时候是spring 增强的对象,只有spring增强的对象,才有切面的能力。
所以结论就是 方法的调用方,iPaperService,即:是未经过Spring AOP增强的对象实例。所以解决问题的思路就有了,想办法用增强后的HelloService实例来调用!
解决办法
方法一 用Autowired 注入自身的实例


首先Spring是支持循环依赖的,所以自己注入自己也是可以的,
方法二:从Spring上下文获取增强后的实例引用


结尾
一个小小问题的记录,就到这里了哈。希望能给碰到的小伙伴带来帮助

日常求赞
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉。
创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见
六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !
转载自:https://juejin.cn/post/6854573218120859655