Java使用@Autowired注解獲取對(duì)象為null的幾種情況及解決方法
情況1:Bean對(duì)象并沒(méi)有交給Spring管理
- 檢查@Autowired的對(duì)象是否已經(jīng)被注入到Spring容器中了;
- 確保使用@Autowired注解的對(duì)象也已存在Spring的容器中。
情況2:對(duì)象使用過(guò)new關(guān)鍵字
這是我遇到的情況,當(dāng)一個(gè)對(duì)象使用過(guò)關(guān)鍵new時(shí),它是不能被Spring所管理的。
所以如果在這些對(duì)象中使用@Autowired去注入對(duì)象,得到的結(jié)果也是為null。
就比如我在項(xiàng)目中遇到的情況:
@Slf4j @Component public class MyCrawler extends WebCrawler { @Autowired private BookFeignService bookFeignSerivce; @Override public boolean shouldVisit(Page referringPage, WebURL url) { // .... } @Override public void visit(Page page) { // .... } }
該類(lèi)繼承了一個(gè)WebCrawler,其實(shí)就是一個(gè)第三方框架,在我執(zhí)行某個(gè)功能的時(shí)候,這些被重寫(xiě)的方法就會(huì)被其內(nèi)部自動(dòng)調(diào)用。
在該類(lèi)中使用@Autowired注入對(duì)象,就會(huì)看到注入的對(duì)象為null,盡管這些對(duì)象已經(jīng)在Spring容器中存在了。
主要原因就是因?yàn)樵擃?lèi)繼承了一個(gè)第三方框架,在執(zhí)行的過(guò)程中,它是被人家框架內(nèi)部創(chuàng)建實(shí)例然后去調(diào)用的,這就導(dǎo)致了可能在內(nèi)部new過(guò)這個(gè)對(duì)象了,所以就導(dǎo)致了@Component對(duì)這個(gè)類(lèi)根本不起作用。
解決方法
那么,如果我們非要在該類(lèi)中獲取到Spring容器中的對(duì)象,應(yīng)該怎么辦?
寫(xiě)一個(gè)工具類(lèi):
@Component public class MyBeanUtil implements ApplicationContextAware { protected static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext app) throws BeansException { if (applicationContext == null) { applicationContext = app; } } /** * 通過(guò)類(lèi)的class從容器中手動(dòng)獲取對(duì)象 */ public static <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); } }
通過(guò)getBean這個(gè)方法就可以獲取到Spring容器中的對(duì)象了。
注意:該類(lèi)一定要加@Component注解。
到此這篇關(guān)于Java使用@Autowired注解獲取對(duì)象為null的幾種情況及解決方法的文章就介紹到這了,更多相關(guān)Java @Autowired獲取對(duì)象為null內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse搭建spring開(kāi)發(fā)環(huán)境圖文教程(推薦)
下面小編就為大家?guī)?lái)一篇Eclipse搭建spring開(kāi)發(fā)環(huán)境圖文教程(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07HttpsURLConnection上傳文件流(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇HttpsURLConnection上傳文件流(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源)
在開(kāi)發(fā)過(guò)程中,很多時(shí)候都會(huì)有垮數(shù)據(jù)庫(kù)操作數(shù)據(jù)的情況,需要同時(shí)配置多套數(shù)據(jù)源,本文主要介紹了springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源),感興趣的可以了解一下2023-09-09Java實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)抽獎(jiǎng)算法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下2022-04-04Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)
mybatis作為一個(gè)流行的持久化工具,緩存必然是缺少不了的組件。通過(guò)這篇文章,就讓我們來(lái)了解一下一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05Springboot項(xiàng)目中kaptcha驗(yàn)證碼的使用方式
這篇文章主要介紹了Springboot項(xiàng)目中kaptcha驗(yàn)證碼的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Java中方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù)
這篇文章主要介紹了Java中方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù),可選參數(shù)是?JDK?5?中新增的特性,也叫變長(zhǎng)參數(shù)或可變參數(shù),固定參數(shù)的概念恰好與可選參數(shù)相反,固定參數(shù)也就是普通的參,下文更多詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-05-05