springboot aop记⼀次SpringBootAspect不⽣效解决过程
转⾃我的个⼈博客:
问题描述
项⽬中两个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设置成懒加载。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论