【最简单的解决方案】spring框架中普通类(工具类)调用service

时间:2024-03-29 09:37:42

                   这套解决方案,纯属博主自己琢磨相出,绝非网上那些随意转载的解决方案!!

                                                                                                                                         ----前言

今天,公司要求我在springboot框架【通用于所有spring项目】的项目中添加一个日志记录的操作,大致实现方案就是提供一个日志工具类,然后将controller层中的数据,通过调用这个工具类提供的方法写入数据库;

该工具类方法的主要实现逻辑:通过调用service,然后再通过mapper操作将信息写入数据库。

要解决的难点:如何在工具类中调用service,然后将写入数据库。

为了更好的描述问题,先将部分主要代码提供给大家。

Logger就是工具类,下方代码是在Controller中调用工具类的方法。

【最简单的解决方案】spring框架中普通类(工具类)调用service

【最简单的解决方案】spring框架中普通类(工具类)调用service

 

下方是Logger工具类中注入ServiceImpl的主要代码

【最简单的解决方案】spring框架中普通类(工具类)调用service

相信这一步,大家都已经做到了,博主高高兴兴的便去运行代码了,结果报空指针异常!!!

,接下来博主便开始debug,发现上面的manageServiceImpl竟然是null!!

那么接下来需要解决的问题即是:上方的实现根本没有让ServiceImpl注入进来。

然后机智的楼主想到,既然你是null,那好,我手动给你创建一个,便new了一个ManageService对象,再去进行数据库操作,结果并不乐观,依然空指针异常!!!

下一步,好,我找度娘求助。解决办法真是让人眼花缭乱啊,最多的解决方法就是如下所示:

【最简单的解决方案】spring框架中普通类(工具类)调用service

博主尖叫一声,这TM什么鸡鸡,从来没有的玩法,评论里竟然一片称赞。。。抱着试试的态度,结果依然凉凉。

但是,博主就是有一股拼的劲头,不搞明白决不罢休,俗话说的好,万变不离其宗,博主决定重新学习spring容器管理对象的基础知识,终于。。。。。找到了原因。

先列出解决方案,只需要在之前的代码上改动一点即可:

在之前的Controller层中注入工具类对象:

【最简单的解决方案】spring框架中普通类(工具类)调用service

注意,注意,最最主要的就是这一点了!!

一定一定要用注入进来的工具类对象,去调用工具类的方法!

【最简单的解决方案】spring框架中普通类(工具类)调用service

好了,问题完美解决!!!

下面分析原因:之前博主调用工具类方法时,是手动new出来的工具类,正是因为是手动new出来的对象,所以不归spring容器管理,继而,这个对象里面的成员属性(即serviceImpl)自然不能注入进来。而当我使用注入进来的工具类对象时,此时对象是由spring容器管理的,所以此对象中的成员属性(即serviceImpl)是可以注入进来的,继而完美!!!