Spring Boot @Autowired 注入為空的情況


在A類中通過@Autowired 注入對象B,結果通過debug發現,注入的對象B為空,導致空指針,
原因是這樣的,A類的實例是通過new創建的,通過Spring上下文找不到B對象
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;        
}

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

參考連接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM