SpringBoot @Autowired註入為空的情況解讀
@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環境沒有搭建好的原因
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring boot 無法註入service問題
- SpringBoot在自定義類中調用service層等Spring其他層操作
- 解決springboot遇到autowire註入為null的問題
- Spring Boot中單例類實現對象的註入方式
- 使用@Autowired 註入RedisTemplate報錯的問題及解決