首先这问题可能的情况很多,这里不再赘述一些常见的错误。
长不看的省流:构造函数里不要调用自动注入的对象
这次遇到的情况是service里面注入mapper,然后一直是null值——剧透一下,问题就在于是在构造函数里面调用了mapper。如果看到这里知道为什么会null,那下面的大佬就不用看了(x)
开始以为是bean的创建顺序问题,去搜了@Order
等一系列东西,觉得指定mapper先于service完成创建就可以正常注入了,但是都没有解决。
最后通过 mapper上@Repository
指定名称,再@DependsOn
指定mapper,成功的在调试中看到了mapper的构造方法先于service的调用,但是仍然不能成功注入——为什么这里不说完成注入,而是说构造方法的调用顺序,或者说是对象的创建顺序呢?这就是问题的所在了
可以先去看一下这篇文章
SpringBoot学习之@PostConstruct、@Autowired与构造函数的执⾏顺序
百度文库的,相当垃圾,不过我们记住他开头的结论就够好了:
执行顺序是:构造函数 => @Autowired => @PostConstruct
而我这里的调用情况是
这就很显然了,构造函数里面的时候调用mapper的时候,字段的值还没有开始注入呢,那自然是null了
所以解决办法:把你希望用构造函数执行的功能提出去一个void方法,变成用@PostConstruct
来执行(我记得好像这玩意要public void来着,但是这里private也能用……回头再说.jpg)
这样一来, 就可以成功看到注入的东西了
(然后发现我redis被之前寄掉的硬盘带走了,还得重装一下,而现在已经半夜3:50了呜呜呜呜呜呜。先睡觉,这个问题搞了俩小时,就到这里解决了)