基于Spring+SpringMVC+Hibernate框架系统, 利用SpringAOP实现写日志,切入点的Controller层出现@AutoWire 注入Service为null的情况分析
最近为了拓展系统,增加了对Controller层写日志的功能,实现方式是基于Spring的AOP来实现的,具体的实现方法我就写了,网上一大堆实现过程。整个实现过程一开始非常快速简单,而且运行基本没有问题。 但突然在要求全面添加Controller的方法日志后,就出现了一个怪异的问题,这个问题就是有一个控制层中用@AutoWired注入的所有Service为null,导致出现java.lang.NullPointerException空指针异常,而其他控制层没出现这种情况。
诡异的是其他控制层没有出现这种情况,日志记录也正常,唯独就这一个控制层出现@AutoWired无法注入的问题,但这个控制层Controller也能正常访问,方法的日志也能正常记录到数据库,就Service没有注入,为null无法使用。一开始我就怀疑可能是文件配置除了问题,检查了一遍也没发现错误的地方,然后又在网上各种百度来确认我的配置是不是有问题,最后都可以确认我的配置没有问题。这其中包括注解包的扫描控制、动态代理是开启等等,真心没发现那里配置错的。在网上也各种查询资料来解答疑惑,但是都说是配置问题,而有的也没有答案能正确解释和解决这个问题的方案。
折腾了两天,我无意中发现了导致这个问题可能原因,最后经过验证证实了我的发现是对的,这就是原因:这个Controller层的所有RequestMapping方法全部是私有的(private),导致在动态代理过程中无法注入private对象。这里跟用@Autowire还是@Resouce没有关系。就是被设置为私有方法导致的。哎呀妈呀 我的天,这个是哪个兔崽子写的顿时气愤啊。(这说明现在的这些程序员质量太差,会敲几个代码就想说自己是程序猿,原理都没搞懂就写程序,哎 坑)
在这个排查过程中也充分的暴露了许多问题,同时也学习到了很多东西。Spring这个庞大的框架如今确实想完全学透是不太可能的,因为它太强大了.还有就是问题排查的思路有问题,一开始的方向是对,不过就是太过于专注在这个方向导致掉进大海了。所以我一直坚信没有解决不了的问题,只是脑子不好使。
当然是否还有情况 也可能导致这个问题,目我不好给予评价,但是需要注意的就是,Bean对象扫描过程不能重复扫描(类似事务不起作用),这样也能导致出现这种现象。