1. 被注入的對(duì)象沒(méi)有加載到spring容器中
通常是因?yàn)楸蛔⑷氲膶?duì)象沒(méi)有被spring掃描到,此時(shí)需要添加對(duì)應(yīng)的包掃描路徑。
添加包掃描
在啟動(dòng)類(lèi)中定義分別掃描兩個(gè)包 ,即在@SpringBootApplication注解的類(lèi)中添加:
@ComponentScan({“com.demo.test1”,“com.demo.common”})
2. 需要自動(dòng)注入的對(duì)象不是spring加載,而是new的方式創(chuàng)建
由于對(duì)象不是spring創(chuàng)建的,當(dāng)然spring也就無(wú)法根據(jù)注解自動(dòng)注入對(duì)應(yīng)的實(shí)例對(duì)象。
此時(shí)可以采用代碼的方式,從spring容器中獲取對(duì)象實(shí)例。
通過(guò)Spring上下文工具類(lèi)獲取bean
定義一個(gè)SpringUtil類(lèi)
/**
* Spring上下文工具類(lèi),用以讓普通類(lèi)獲取Spring容器中的Bean
*/
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
//獲取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
}
//通過(guò)name獲取 Bean
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
}
然后在類(lèi)A中通過(guò)如下調(diào)用獲取Spring容器中的實(shí)例
3. 需要自動(dòng)注入的對(duì)象不是spring加載,而是采用反射的方式創(chuàng)建
這種情況和第二種情況類(lèi)似,通常在一些框架調(diào)用的時(shí)候,采用的對(duì)象創(chuàng)建方式,為了避免對(duì)spring的依賴(lài),采用類(lèi)的反射方式進(jìn)行創(chuàng)建。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-604756.html
此時(shí)可以采用代碼的方式,從spring容器中獲取對(duì)象實(shí)例。
方法和第二種情況相同。
4. 使用springboot的devtools熱部署加載的類(lèi)
熱部署加載的類(lèi)使用的加載器和spring容器的加載器不同,所以熱部署加載器加載的類(lèi),訪問(wèn)不到spring容器中的對(duì)象。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-604756.html
這種情況通常發(fā)生在使用熱部署過(guò)程中,禁用熱部署后該問(wèn)題就不存在了。
到了這里,關(guān)于springboot中@Autowired 注入失效的四種原因及解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!