困扰了好几天的问题,终于找到解决方案
今天遇到的问题是Spring中使用Autowire的注解注入service,启动过程中debug可以看到proxy对象,但是实际运行中会报NullPointerException。
暴力解决的办法是直接从context里获取bean,不够优雅。目前正在研究Spring代理机制。
问题彻底解决~
原因是使用了AOP切入点,在配置文件中
<aop:aspect id=“userOperationLog” ref=“userOperationLogAspect”>
<aop:pointcut expression=“execution(* .action..*(…))” />
<aop:after method=“operationLog” pointcut-ref=“userOperationLogCut” />
</aop:aspect>
expression 包含了我的controller。然后我的方法都是private的。。。这AOP就不干了。
具体原因在这篇博客中有提及:
SpringAOP导致@Autowired依赖注入失败
简单说是因为AOP代理只能取到public和protected方法,private方法并没有被代理获取。
把所有方法改成public,或者在类上加@Aspect注解,问题解决。
此处由于我的controller并不是一个切面服务类,所以我选择把方法改成public。
奇怪的是debug可以进到private代码中,只有Autowired的对象是null。与此同时public方法的Autowired的对象就存在。猜测是每次调用代理方法都做一次注入?暂时存疑。
————————————————
原文链接:https://blog.csdn.net/leon198442/article/details/73332695