面試官:為什么在new 對(duì)象里面使用自動(dòng)注入對(duì)象會(huì)報(bào)空指針異常?
根本原因在于當(dāng)Spring框架幫我們管理的時(shí)候就會(huì)自動(dòng)的初始化接下來(lái)會(huì)用到的屬性,而通過(guò)new對(duì)象的方式,在該new對(duì)象中使用到的一些實(shí)例就需要自己去做初始化,否則就會(huì)報(bào)空指針異常。
如下例子所示:
TestService 通過(guò)@Autowired注入,那么Spring容器就會(huì)自動(dòng)注入TestService 中會(huì)用到的TestDao。
如例一所示。
例一:
@RestController
@RequestMapping(value = "/test")
public class TestController {
@Autowired
private TestService testService;
@RequestMapping(value = "/print",method = RequestMethod.GET)
public void test() {
testService.test();
}
}
@Service
public class TestService {
@Autowired
private TestDao testDao;
public void test() {
testDao.test();
}
}
如果TestService 通過(guò)new對(duì)象方式新建的話(huà),Spring容器就不會(huì)自動(dòng)注入TestDao,此時(shí)testDao為null,會(huì)報(bào)空指針異常。此時(shí)就需要在TestService中自己new一個(gè)TestDao對(duì)象。如例二所示。
例二:
@RestController
@RequestMapping(value = "/test")
public class TestController {
private TestService testService = new TestService ();
@RequestMapping(value = "/print",method = RequestMethod.GET)
public void test() {
testService.test();
}
}
@Service
public class TestService {
@Autowired
private TestDao testDao;
public void test() {
TestDao testDao = new TestDao ();
testDao.test();
}
}
總結(jié):
在程序啟動(dòng)時(shí),Spring會(huì)按照一定的加載鏈來(lái)加載并初始化Spring容器中的組件。
例如:在A中注入B,B中注入C。在A中調(diào)用B,來(lái)使用B中調(diào)用C的方法時(shí),如果不采用自動(dòng)注入,而是使用new對(duì)象方式的話(huà),就會(huì)報(bào)空指針異常(因?yàn)锽中的C并沒(méi)有被初始化)。
感謝閱讀,希望對(duì)你有所幫助 :)
來(lái)源:blog.csdn.net/LuQiaoYa/article/details/111573886
END
分享一下我寫(xiě)的《10萬(wàn)字Springboot經(jīng)典學(xué)習(xí)筆記》中,點(diǎn)擊下面小卡片,進(jìn)入【Java禿頭哥】,回復(fù):筆記,即可免費(fèi)獲取。
點(diǎn)贊是最大的支持

