Java使用@Autowired注解獲取對象為null的幾種情況及解決方法
情況1:Bean對象并沒有交給Spring管理
- 檢查@Autowired的對象是否已經(jīng)被注入到Spring容器中了;
- 確保使用@Autowired注解的對象也已存在Spring的容器中。
情況2:對象使用過new關(guān)鍵字
這是我遇到的情況,當一個對象使用過關(guān)鍵new時,它是不能被Spring所管理的。
所以如果在這些對象中使用@Autowired去注入對象,得到的結(jié)果也是為null。
就比如我在項目中遇到的情況:
@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) {
// ....
}
}該類繼承了一個WebCrawler,其實就是一個第三方框架,在我執(zhí)行某個功能的時候,這些被重寫的方法就會被其內(nèi)部自動調(diào)用。
在該類中使用@Autowired注入對象,就會看到注入的對象為null,盡管這些對象已經(jīng)在Spring容器中存在了。
主要原因就是因為該類繼承了一個第三方框架,在執(zhí)行的過程中,它是被人家框架內(nèi)部創(chuàng)建實例然后去調(diào)用的,這就導致了可能在內(nèi)部new過這個對象了,所以就導致了@Component對這個類根本不起作用。
解決方法
那么,如果我們非要在該類中獲取到Spring容器中的對象,應該怎么辦?
寫一個工具類:
@Component
public class MyBeanUtil implements ApplicationContextAware {
protected static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext app) throws BeansException {
if (applicationContext == null) {
applicationContext = app;
}
}
/**
* 通過類的class從容器中手動獲取對象
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
}通過getBean這個方法就可以獲取到Spring容器中的對象了。
注意:該類一定要加@Component注解。
到此這篇關(guān)于Java使用@Autowired注解獲取對象為null的幾種情況及解決方法的文章就介紹到這了,更多相關(guān)Java @Autowired獲取對象為null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot使用sharding jdbc的配置方式
這篇文章主要介紹了spring boot使用sharding jdbc的配置方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
SpringMVC?bean實現(xiàn)加載控制方法詳解
SpringMVC是一種基于Java,實現(xiàn)了Web?MVC設計模式,請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進行職責解耦?;谡埱篁?qū)動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發(fā),SpringMVC也是要簡化我們?nèi)粘eb開發(fā)2022-08-08
SpringBoot 統(tǒng)一公共返回類的實現(xiàn)
本文主要介紹了SpringBoot 統(tǒng)一公共返回類的實現(xiàn),配置后臺的統(tǒng)一公共返回類,這樣做目的是為了統(tǒng)一返回信息,文中示例代碼介紹的很詳細,感興趣的可以了解一下2022-01-01

