詳解@Autowired(required=false)注入注意的問題
1、前言
在使用spring開發(fā)過程中,我們基本上都是使用@Autowired這個(gè)注解,用來注入已有的bean。但是有些時(shí)候,會(huì)注入失敗。當(dāng)我們加上參數(shù)(required=false)就能解決。今天整理一個(gè)我在實(shí)際開發(fā)中的例子
2、required屬性
@Autowired(required=true):當(dāng)使用@Autowired注解的時(shí)候,其實(shí)默認(rèn)就是@Autowired(required=true),表示注入的時(shí)候,該bean必須存在,否則就會(huì)注入失敗。
@Autowired(required=false):表示忽略當(dāng)前要注入的bean,如果有直接注入,沒有跳過,不會(huì)報(bào)錯(cuò)。
3、使用
我們的正常使用會(huì)在Controller層注入service,在service中注入mapper。
但是如果有一個(gè)公用方法,需要注入某個(gè)元素,并且這個(gè)方法在公用模塊里。當(dāng)該模塊被引入其他項(xiàng)目中,該項(xiàng)目中并需要注入所需的bean時(shí),就出現(xiàn)如圖【2】的類似錯(cuò)誤。那么問題來了,我們項(xiàng)目中并不需要該要注入的類,使得整個(gè)項(xiàng)目報(bào)錯(cuò)。
4、原因分析及解決
在容器的啟動(dòng)過程中,會(huì)初始化很多bean,這也是spring的核心之一(IOC)。但是在注入的過程中,掃描到公共方法中要注入的bean,并未找到,強(qiáng)行注入就會(huì)注入失敗。我們又不能單獨(dú)的去除改方法,所以我們采取的思想就是有bean就注入,沒有就不注入。解決辦法就是@Autowired(required=false)。
5、容器的父子關(guān)系
通過日志如圖:
通過日志我們可以看到,容器的啟動(dòng)順序。
- 先加載父容器(spring),后加載子容器(springmvc)。所以在Controller里面注入service時(shí),父容器中的bean已經(jīng)初始化完畢,所以正常注入。
- 在父子容器中,父容器元素對(duì)子容器可見,子容器對(duì)父容器的元素不可見。所以父容器中不能獲取子容器的元素,但是子容器可以獲取父容器的元素。
- 當(dāng)前容器均可獲取當(dāng)前容器中的元素,也就是說在service中可以注入其他service。
但是,當(dāng)前容器不可以注入自己。這樣就會(huì)不停的注入自己,陷入死循環(huán)。從而找不到要注入的bean。如圖:
當(dāng)然我們幾乎不能這樣坑自己,然而我就這么坑了自己。。。
到此這篇關(guān)于@Autowired(required=false)注入注意的問題的文章就介紹到這了,更多相關(guān)@Autowired required=false注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解eclipse將項(xiàng)目打包成jar文件的兩種方法及問題解決方法
本文給大家介紹了eclipse中將項(xiàng)目打包成jar文件的兩種方法及其遇到問題解決方法,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12Java實(shí)現(xiàn)Excel數(shù)據(jù)驗(yàn)證功能
在Java中,開發(fā)者可以使用一些開源的庫(如Apache POI)來添加、修改和處理Excel中的數(shù)據(jù),下面我們就來看看如何使用Java實(shí)現(xiàn)添加,修改和刪除Excel數(shù)據(jù)驗(yàn)證吧2023-10-10Spring計(jì)時(shí)器StopWatch的具體使用
本文主要介紹了Spring計(jì)時(shí)器StopWatch的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06SpringCloud2020 bootstrap 配置文件失效的解決方法
這篇文章主要介紹了SpringCloud2020 bootstrap 配置文件失效的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Springboot中的Validation參數(shù)校驗(yàn)詳解
這篇文章主要介紹了Springboot中的Validation參數(shù)校驗(yàn)詳解,Springboot參數(shù)校驗(yàn)是一種常用的驗(yàn)證機(jī)制,在傳遞參數(shù)時(shí)進(jìn)行校驗(yàn),以確保參數(shù)的有效性和正確性,該機(jī)制可以幫助開發(fā)者在代碼實(shí)現(xiàn)前就避免一些常見的錯(cuò)誤,需要的朋友可以參考下2023-10-10詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子
這篇文章主要介紹了詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06