首页 > 编程语言 > 详细

记一次SpringBoot Aspect不生效解决过程

时间:2020-10-23 09:43:33      阅读:190      评论:0      收藏:0      [点我收藏+]

转自我的个人博客:《记一次SpringBoot Aspect不生效解决过程》

 

问题描述

项目中两个aspect,一个环绕controller,用于记录日志,能够正常在point处进入aspect处理;另一个aspect 的point设于service,死活不能进入。


解决思路

1、首先排查pointcut配置是否正确,检查后发现没有问题;
2、我们都知道spring的aop运用的是动态代理技术,由spring托管的bean大多为代理bean,controller层打印service对象,发现service对象竟然直接是service实现类的“本尊”。如下图所示:
 

技术分享图片



再看springboot启动日志,发现roleServiceImpl实例化的时候有如下提示:
Bean ‘roleServiceImpl‘ of type [com.gaoxiaobo.wms.service.impl.RoleServiceImpl] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
 

技术分享图片



那么问题就明了了,我们在controller层调用的roleServiceImpl对象非代理对象而是其本身,那么对其的aspect是不会生效的,不仅aspsect不会生效,事务注解@Transactional也不会生效,问题还是相当严重的。

那么,why 没有生成其代理对象呢?一定是哪里先调用了roleServiceImpl导致spring优先实例化了该bean;

通过排查,找到了罪魁祸首:shiro 的LifecycleBeanPostProcessor优先实例化自定义Realm,自定义的Realm依赖于roleService,导致roleService被初始化。


解决方法
自定义realm中roleService设置成懒加载。

记一次SpringBoot Aspect不生效解决过程

原文:https://www.cnblogs.com/xiaobo060/p/13861742.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!