解決springboot遇到autowire註入為null的問題
這個問題困擾瞭很久,有些類不是controller在使用autowired註入的類顯示為空,找到網上的方法是在類初始化時主動註入被Autowired的類,如下圖
這樣的方法是可行的,最後引用時使用上圖中doubleTeachSendMsg.doubleTeachService.sendMsg();方法即可,但是使用起來未免太麻煩,而且也不是spring依賴註入的原則,這個出現原因其實就是此類是在bean加載之前被調用,或者springboot在加載時沒有識別到此類,所以註入為空,要想使此類被識別到,那麼就要在啟動時被spring識別到,需要將其變為bean對象並被識別到。如下圖
springboot啟動會掃描configuration,正常添加信息在最下面的是new MyWebSocketHandler(),在此處使用spring的依賴註入,使spring識別到此類,這樣,添加的autowired方法就不會是null瞭,並且也不需要在添加 這種方式瞭
補充:關於springboot使用@Autowired註解向非controller類中註入bean為null的問題
這種問題一般分為2種情況
第一種情況:
如果你要在java A類中 使用@Autowired註入java B類,如果註入不瞭的話,通過添加以下三個關鍵的地方,可以解決該問題:
關於@PostConstruct:被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,並且隻會被服務器調用一次,類似於Serclet的inti()方法。
被@PostConstruct修飾的方法會在構造函數之後,init()方法之前運行
@Component public class A{ @Autowired public B b; public static A a; @PostConstruct //通過@PostConstruct實現初始化bean之前進行的操作 public void init() { a= this; a.b= this.b; }
有三個地方需要註意一下(敲黑板!):
1.@Component
2.public static A a; 註意這個為 public 不然沒有權限
3.@PostConstruct public void init() {}
第二種情況:
你要被註入的類繼承瞭thread類,這樣的話你通過上面的方法來做的,仍然註入不進去,原因是因為spring的非線程安全問題,不讓你註入,註入的結果是null
解決辦法寫一個構造函數或者set和get方法把你要註入的service傳進來就好
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- springboot 如何解決static調用service為null
- Spring boot 無法註入service問題
- SpringBoot在自定義類中調用service層等Spring其他層操作
- Spring使用@Autowired註解靜態實例對象方式
- 淺談SpringBoot中的Bean初始化方法 @PostConstruct