首頁 > 軟體

SpringBoot @Autowired注入為空的情況解讀

2023-03-07 06:03:17

@Autowired注入為空的情況解讀

因最近在開發中遇到了使用@Autowired註解 自動裝配時,會報空指標,發現物件並沒有裝配進來,通過查詢,總結了幾種可能造成這種情況的原因。

記錄下

1.最簡單的一種情況,檢視被裝配的類,也就是@Autowired註解下的類是否新增了註解交給SpringBoot託管,@service等註解,或者是直接加上@Component註解。

2.看你的xxxxxApplication是否在根目錄,因為springboot預設掃描的就是啟動類下的目錄(這個我記著只限於Springboot2.0.5之前的版本,因為新版可以通過@ComponenScan註解去指定掃描範圍)。

3.@Service、@Componet、@Configuration、@Repository等Spring註解未被掃描到,例如:springboot的主類掃描規則,就是說需要檢視你的Springboot啟動類,xxxxxApplication,檢視啟動類上註解是否加了@ComponenScan註解,是否指定了掃描範圍。

使用springboot啟動類設定掃描的兩種註解設定方式:

  • 1、@Controller @EnableAutoConfiguration @ComponentScan 。
  • 2、@SpringBootApplication

4.使用救急方法,這是如果沒找到原因,我們先使用其他方法讓程式先能正常執行和偵錯,後續再查詢問題。

@Autowired
 private SchedulerFactoryBean schedulerFactoryBean;
    
 private static QuartzManager quartzManager;
    
 /**
  * 通過@PostConstruct實現初始化bean之前進行的操作
  * @desc 初始化操作,得到QuartzManager範例
  * @Date 2019年1月7日
  */
 @PostConstruct 
 public void init() {  
      quartzManager = this;  
      quartzManager.schedulerFactoryBean = this.schedulerFactoryBean;        
}

使用@PostConstruct 初始化。

5.這個原因很重要,也是經常會被忽略的一個因素。呼叫者是new出來的。如果類A中存在成員屬性B, B是通過@Autowired自動注入,而類A的範例是通過new的方式產生的,那麼自動注入會失效的,此時通過Spring的上下文獲取所有的Bean的方法來獲取B。此時,看看你在報空指標的那個類,看它是否是被new出來的,如果是,不妨使用SpringUtil.getBean()方法替換下, 然後再試下!

@Autowired注入bean找不到異常

異常描述

***************************
APPLICATION FAILED TO START
***************************

Description:

Field clientAuthService in com.yinhai.mzgh.eurekaclient.feign.interceptor.Oauth2RequestInterceptor 
required a bean of type 'com.yinhai.mzgh.eurekaclient.feign.service.ClientAuthService' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.yinhai.mzgh.eurekaclient.feign.service.ClientAuthService' in your configuration.

問題原因

這個問題是環境問題,在Profiles 中之前是dev 環境

我剛來,猜測是 dev環境沒有搭建好的原因

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com