今天,公司要求我在springboot框架的项目中添加一个日志记录的操作,大致实现方案就是提供一个日志工具类,然后将controller层中的数据,通过调用这个工具类提供的方法写入数据库;
该工具类方法的主要实现逻辑:通过调用service,然后再通过mapper操作将信息写入数据库。
要解决的难点:如何在工具类中调用service,然后将写入数据库。
为了更好的描述问题,先将部分主要代码提供给大家。
Logger就是工具类,下方代码是在Controller中调用工具类的方法。
下方是Logger类中注入ServiceImpl的主要代码
相信这一步,大家都已经做到了,博主高高兴兴的便去运行代码了,结果报空指针异常!!!!,凉了,凉了,接下来博主便开始debug,发现上面的manageServiceImpl竟然是null!!
问题发现了:上方的实现根本没有让ServiceImpl注入进来 啊!
然后机智的楼主想到,既然你是null,那好,我手动给你创建一个,便new了一个ManageService对象,再去进行数据库操作,结果并不乐观,依然空指针异常!!!
下一步,好,我找度娘求助。解决办法真是让人眼花缭乱啊,最多的解决方法就是如下所示:
博主尖叫一声,这TM什么鸡鸡,从来没有的玩法,评论里竟然一片称赞。。。抱着试试的态度,结果依然凉凉。
脑子里现在都是凉凉,但是博主就是有一股拼的劲头,不搞明白决不罢休,俗话说的好,万变不离其宗,博主决定重新学习spring容器管理对象的基础知识,终于。。。。。找到了原因。
先列出解决方案,只需要在之前的代码上改动一点即可:
在之前的Controller层中注入工具类对象:
注意,注意,最最主要的就是这一点了!!
一定一定要用注入进来的工具类对象,去调用工具类的方法!
好了,问题完美解决!!!
下面分析原因:之前博主调用工具类方法时,是手动new出来的工具类,正是因为是手动new出来的对象,所以不归spring容器管理,继而,这个对象里面的成员属性(即serviceImpl)自然不能注入进来。而当我使用注入进来的工具类对象时,此时对象是由spring容器管理的,所以此对象中的成员属性(即serviceImpl)是可以注入进来的,继而完美!!!