ignoreDependencyInterface和ignoreDependencyType的作用?

什么是ignoreDependencyInterface和ignoreDependencyType?

?相信看過Spring源碼的讀者一定在遇到過這么兩個方法:

/**
* Ignore the given dependency interface for autowiring.
* 忽略給定依賴接口的自動裝配 
* @see org.springframework.context.ApplicationContextAware
*/
void ignoreDependencyInterface(Class<?> ifc);
?
/**
* Ignore the given dependency type for autowiring:
* 忽略給定依賴類型的自動裝配
* @param type the dependency type to ignore
*/
void ignoreDependencyType(Class<?> type);

只看官方文檔的解釋很可能理解錯誤,作者也去查閱了一些文章,但是描述的還是有點難以理解,于是自己實驗證實了一下,話不多說,本文直接通過例子給大家詳細證明這兩個接口的意思和使用方法.

準備用來實驗注入spring容器的bean

首先我們需要準備五個model,作為實驗注入Spring容器中的實例對象,如下:

public class User {
    }
    //這個接口類用來測試ignoreDependencyInterface方法,看能否注入User
    public interface UserAware {
        void setUser(User user);
    }
?
    //這個用來測試ignoreDependencyType方法
    public class Admin {
    }
?
    //這個就是和上面的做對比,不對它做任何處理
    public class Role {
    }
?
    //實現(xiàn)了上面的UserAware接口并實現(xiàn)setUser方法炸庞,
    //并且將User埠居、Admin纸颜、Role屬性注入
   public class Person implements UserAware{
    private User user;
    private Admin admin;
    private Role role;
?
    public User getUser() {
        return user;
    }
    //實現(xiàn)了UserAwre接口的setUser方法
    public void setUser(User user) {
        this.user = user;
    }
?
    public Admin getAdmin() {
        return admin;
    }
    public void setAdmin(Admin admin) {
        this.admin = admin;
    }
?
    public Role getRole() {
        return role;
    }
    public void setRole(Role role) {
        this.role = role;
    }
}

上面代碼中各個對象之間的關(guān)系如下:

image

其中User、Admin、Role都是空的實例對象,UserAware是個接口,里面有一個setUser(User user)方法,Person類中有User冈止、Admin熙暴、Role三個對象屬性,并且實現(xiàn)了UserAwre接口和它的方法,然后對所有的屬性添加get周霉、set方法.

配置spring注入屬性的xml文件

我們需要將上面的實例bean注入到Spring容器中,所以我們配置一個xml,以xml的方式將bean注入到spring容器中,如下:

<?xml version="1.0" encoding="UTF-8"?>

?
    

配置啟動類

    @Test
    public void testSimpleLoad(){
?
        XmlBeanFactory beanFactory=new XmlBeanFactory(new ClassPathResource("ignore/beanFactoryTest.xml"));
        //beanFactory.ignoreDependencyInterface(UserAware.class);//測試ignoreDependencyInterface方法作用
        //beanFactory.ignoreDependencyType(Admin.class);//測試ignoreDependencyType方法作用
        Person person = beanFactory.getBean("person", Person.class);
        System.out.println("person"+person);
    }

好了,所需要測試條件,我們都準備好,接下來我們按照下面5條的流程進行測試,每條我都會截圖運行結(jié)果,我們通過結(jié)果就可以分析出最終的結(jié)果.

  1. 先測試不開啟ignoreDependencyInterface方法和ignoreDependency方法的時候,獲取person中的屬性值有些哪些?

  2. 測試開啟上面代碼第五行,啟動ignoreDependencyInterface(UserAware.class)方法后,獲取person中的屬性值有哪些?

  3. 測試關(guān)閉上面第五行,開啟上面代碼第六行,啟動ignoreDependency(Admin.class)方法后,獲取person中的屬性值有哪些?

  4. 測試同時啟用ignoreDependencyInterface方法和ignoreDependency方法后,獲取的person中的屬性值有哪些?

  5. 上面4的測試是依賴xml配置中default-autowire="byType"測試的,我們把它改成default-autowire="byName"后在測試一次第4條,結(jié)果又如何?

測試開始

  1. 先測試不開啟ignoreDependencyInterface方法和ignoreDependency方法的時候,獲取person中的屬性值有些哪些?運行結(jié)果截圖如下:
image

圖中我們可以看出,person中的三個屬性值都能獲取到.

  1. 測試只開啟ignoreDependencyInterface(UserAware.class)方法后,運行結(jié)果如下圖:
image

上圖中我們可以看到person對象中的user屬性值為空,說明user屬性值在開啟了ignoreDependencyInterface(UserAware.class)方法后并不能自動裝配到person中(注意,user只是不能自動注入到person對象中,Spring容器中依然有user實例),到這里我們可以得到一個小結(jié)論:ignoreDependencyInterface方法是忽略指定接口(UserAwre)的set方法的自動裝配!

3.接下來測試只開啟ignoreDependency(Admin.class)方法,運行結(jié)果如下圖:

image

通過運行結(jié)果可以發(fā)現(xiàn),person對象中的admin屬性沒有被自動裝配到person對象中,所以我們得出一個小結(jié)論:ignoreDependency方法忽略指定依賴類型的自動裝配,ignoreDependency和ignoreDependencyInterface不同的是一個前者按照class類型進行忽略自動裝配,后者按照接口中的set方法進行忽略自動裝配.

4.接下來我們同時開啟ignoreDependency和ignoreDependencyInterface方法,運行截圖如下:

image

上圖中可以看出,user和admin都不能自動裝配到person對象中.

5.接下來我們修改xml配置文件中的default-autowire="byType",修改為default-autowire="byName",然后在開啟ignoreDependency和ignoreDependencyInterface方法的同時運行的結(jié)果截圖如下:

image

通過運行結(jié)果我們可以分析出:ignoreDependency和ignoreDependencyInterface方法的忽略自動裝配和自動綁定方式無關(guān)!

總結(jié)

好了通過上面的實驗我們可以得出一下結(jié)論:

  1. ignoreDependencyInterface方法忽略指定依賴接口的自動裝配指的是忽略接口中的set方法這樣的自動裝配方式

  2. ignoreDependency忽略指定依賴類型的自動裝配指的是忽略參數(shù)class類型的自動裝配.

  3. 以上兩種忽略方式都和自動裝配(自動綁定)的方式無關(guān).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璃饱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子磷支,更是在濱河造成了極大的恐慌食寡,老刑警劉巖抵皱,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伤为,居然都是意外死亡钮呀,警方通過查閱死者的電腦和手機爽醋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門光戈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遂赠,“玉大人跷睦,你說我怎么就攤上這事抑诸⊥上纾” “怎么了层玲?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵畔派,是天一觀的道長父虑。 經(jīng)常有香客問我士嚎,道長莱衩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上奋单,老公的妹妹穿的比我還像新娘览濒。我一直安慰自己贷笛,他們只是感情好乏苦,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布洞就。 她就那樣靜靜地躺著奖磁,像睡著了一般繁疤。 火紅的嫁衣襯著肌膚如雪稠腊。 梳的紋絲不亂的頭發(fā)上架忌,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天饰恕,我揣著相機與錄音埋嵌,去河邊找鬼雹嗦。 笑死合是,一個胖子當著我的面吹牛聪全,可吹牛的內(nèi)容都是我干的荔烧。 我是一名探鬼主播鹤竭,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼吝岭,長吁一口氣:“原來是場噩夢啊……” “哼吧寺!你這毒婦竟也來了稚机?” 一聲冷哼從身側(cè)響起赖条,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碱茁,失蹤者是張志新(化名)和其女友劉穎纽竣,沒想到半個月后蜓氨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穴吹,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡刀荒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年干毅,在試婚紗的時候發(fā)現(xiàn)自己被綠了硝逢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渠鸽。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡徽缚,死狀恐怖凿试,靈堂內(nèi)的尸體忽然破棺而出那婉,到底是詐尸還是另有隱情党瓮,我是刑警寧澤寞奸,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布呻率,位于F島的核電站礼仗,受9級特大地震影響逻悠,放射性物質(zhì)發(fā)生泄漏童谒。R本人自食惡果不足惜饥伊,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一愉豺、第九天 我趴在偏房一處隱蔽的房頂上張望茫因。 院中可真熱鬧冻押,春花似錦洛巢、人聲如沸稿茉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蘸嘶。三九已至,卻和暖如春挚冤,著一層夾襖步出監(jiān)牢的瞬間赞庶,已是汗流浹背歧强。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工肤京, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茅特,地道東北人白修。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓舟山,卻偏偏與公主長得像卤恳,于是被迫代替她去往敵國和親突琳。 傳聞我的和親對象是個殘疾皇子拆融,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容