解決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。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: