Spring的依賴注入及三種配置方式(Spring的測(cè)試框架和配置文件)

Spring的測(cè)試框架和ApplicationContext配置文件

一借宵、ApplicationContext的實(shí)現(xiàn)類

1.1 使用FileSystemXmlApplicationContext獲取spring配置文件

Application.XML文件如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <description>Spring Quick Start</description>

    <bean id="TheAction1" class="com.example.service.LowerAction">
        <property name="prefix">
            <value>Hi</value>
        </property>
        <property name="message">
            <value>Good Morning</value>
        </property>
    </bean>
    <bean id="TheAction2" class="com.example.service.LowerAction">
        <constructor-arg index="0">
            <value>Hi</value>
        </constructor-arg>
        <constructor-arg index="1">
            <value>Good Afternoon</value>
        </constructor-arg>
    </bean>
</beans>

使用FileSystemXmlApplicationContext來獲取spring配置文件

    @Test
    public void test1() {
        String XML = "file:src/applicationContext.xml";
        ApplicationContext ctx = new FileSystemXmlApplicationContext(XML);
        Action action = (Action) ctx.getBean("TheAction1");
        action.execute("Rod Johnson4");
    }

實(shí)驗(yàn)結(jié)果如下:


實(shí)驗(yàn)結(jié)果

想到的問題 FileSystemXmlApplicationContext 的路徑
沒有盤符的是項(xiàng)目工作路徑,即項(xiàng)目的根目錄毡泻;
有盤符表示的是文件絕對(duì)路徑喧锦。
一般用file:作為前綴癌椿,也可以省略

使用絕對(duì)路徑:

    @Test
    public void test1() {
        String XML="file:/Users/wushuohan/IdeaProjects/hello/src/applicationContext.xml";
        ApplicationContext ctx = new FileSystemXmlApplicationContext(XML);
        Action action = (Action) ctx.getBean("TheAction1");
        action.execute("Rod Johnson4");
    }

實(shí)驗(yàn)中碰到的問題
在實(shí)驗(yàn)中一開始只注釋掉了@ContextConfiguration罩旋,而忘記注釋掉@RunWith无虚。
錯(cuò)誤代碼如下:

@RunWith(SpringRunner.class)
//@ContextConfiguration(locations={"file:src/applicationContext.xml"})
public class Test2_InJunit {
    @Test
    public void test1() {
        String XML = "file:src/applicationContext.xml";
        ApplicationContext ctx = new FileSystemXmlApplicationContext(XML);
        Action action = (Action) ctx.getBean("TheAction1");
        action.execute("Rod Johnson4");
    }

程序報(bào)錯(cuò)如下:


報(bào)錯(cuò)

錯(cuò)誤原因
@RunWith是一個(gè)運(yùn)行器边涕,而@ContextConfiguration指定 Spring 配置文件所在的位置晤碘。
@RunWith(SpringRunner.class)讓測(cè)試運(yùn)行于Spring測(cè)試環(huán)境,Spring框架在org.springframework.test.annotation 包中提供功蜓。

因?yàn)锳ction1是我自己在XML里定義的bean园爷,而我這里只使用了@RunWith導(dǎo)致了程序拋出空指針異常,因?yàn)椴]有被初始化的相應(yīng)Bean對(duì)象式撼。

從這個(gè)問題中我們可以近一步考慮Spring容器與Bean之間的關(guān)系:

ApplicationContext ctx=new ClassPathXmlApplicationContext("file:src/ApplicationContext.xml");
Action action = (Action)ctx.getBean("TheAction1");

在創(chuàng)建ApplicationContext實(shí)例對(duì)象過程中會(huì)創(chuàng)建一個(gè)spring容器童社,該容器會(huì)讀取配置文件" file:src/ApplicationContext.xml ",并統(tǒng)一管理由該文件中定義好的所有bean實(shí)例對(duì)象端衰。
如果要獲取某個(gè)bean實(shí)例叠洗,使用getBean方法就行了。
因此只需要將Action提前配置在xml文件中旅东,之后可以不需使用new Action()的方式創(chuàng)建實(shí)例灭抑,而是通過容器來獲取實(shí)例,這就相當(dāng)于將Action的控制權(quán)交由spring容器了抵代。


1.2使用ClassPathXmlApplicationContext獲取Spring配置文件

測(cè)試函數(shù)如下:

    @Test
    public void test2() {
        String XML = "file:src/applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext("src/applicationContext.xml");
        Action action1 = (Action) ctx.getBean("TheAction1");
        action1.execute("Rod Johnson5");
    }

實(shí)驗(yàn)結(jié)果如下所示:


實(shí)驗(yàn)結(jié)果

想到的問題:ClassPathXmlApplicationContext的路徑有哪些寫法腾节?
默認(rèn)的是讀取classes文件夾下的文件,可以在前面加上classpath,不加也可以荤牍。
用file作前綴加上絕對(duì)路徑也可以案腺。

實(shí)驗(yàn)中碰到的問題1:classpath在哪里?
一開始直接把XML文件放在TARGET的CLASSES下面康吵,報(bào)錯(cuò)如下:

報(bào)錯(cuò)

打印classpath劈榨,在控制臺(tái)里查看具體路徑:

    @Test
    public void testt(){
        String s[] = System.getProperty("java.class.path").split(";");
        for (String string : s) {
            System.out.println(string);
        }

    }

打印結(jié)果如下:


打印結(jié)果

還是不知道在哪里……

最后我把XML文件直接放在Resource文件夾下:


放在Resource文件夾下

測(cè)試成功:


測(cè)試成功

1.3使用 @ContextConfiguration(locations={……})獲取Spring配置文件

測(cè)試代碼如下:

@RunWith(SpringRunner.class)
@ContextConfiguration(locations={"file:src/applicationContext.xml"})
public class Test2_InJunit {
    @Test
    public void test3() {
        action1.execute("Rod Johnson5");
    }

    @Autowired
    @Qualifier("TheAction1")
    Action action1;
}

實(shí)驗(yàn)結(jié)果如下:


實(shí)驗(yàn)結(jié)果

實(shí)驗(yàn)中想到的問題:為什么不再需要像之前那樣getBean()晦嵌?

因?yàn)橛蠤Autowired同辣。
Spring 通過一個(gè) BeanPostProcessor 對(duì) @Autowired 進(jìn)行解析拷姿,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。

Spring 容器啟動(dòng)時(shí)旱函,AutowiredAnnotationBeanPostProcessor 將掃描 Spring 容器中所有 Bean响巢,當(dāng)發(fā)現(xiàn) Bean 中擁有 @Autowired 注釋時(shí)就找到和其匹配(默認(rèn)按類型匹配)的 Bean,并注入到對(duì)應(yīng)的地方中去棒妨。

實(shí)驗(yàn)中碰到的問題:
XML文件里的Bean太多踪古,報(bào)錯(cuò)如下

報(bào)錯(cuò)

解決方法,在@AutoWired下加上@Qualifier

    @Test
    public void test3() {
        action1.execute("Rod Johnson5");
        action2.execute("Rod Johnson5");

    }
    @Autowired
    @Qualifier("TheAction1")
    Action action1;

    @Autowired
    @Qualifier("TheAction2")
    Action action2;

本章的總結(jié)

BeanFactory和ApplicationContext是Spring的兩大核心接口券腔,其中ApplicationContext是BeanFactory的子接口伏穆。
它們都可以當(dāng)作Spring的容器,Spring容器是生成Bean實(shí)例的工廠颅眶,并管理容器中的Bean蜈出。在基于Spring的Java EE應(yīng)用中,所有的組件都被當(dāng)成Bean處理涛酗,包括數(shù)據(jù)源铡原,Hibernate的SessionFactory、事務(wù)管理器等商叹。

BeanFactory負(fù)責(zé)配置燕刻、創(chuàng)建、管理Bean剖笙,還管理著Bean和Bean之間的依賴關(guān)系卵洗。

ApplicationContext常用的實(shí)現(xiàn)類是:
FileSystemXmlApplicationContext
ClassPathXmlApplicationContext
AnnotationConfigApplicationContext
除了提供BeanFactory所支持的所有功能外,ApplicationContext還有額外的功能,如資源訪問弥咪,比如訪問URL和文件过蹂、同時(shí)加載多個(gè)配置文件、以聲明方式啟動(dòng)并創(chuàng)建Spring容器等


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末聚至,一起剝皮案震驚了整個(gè)濱河市酷勺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扳躬,老刑警劉巖脆诉,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異贷币,居然都是意外死亡击胜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門役纹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偶摔,“玉大人,你說我怎么就攤上這事促脉〕秸” “怎么了信不?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亡呵。 經(jīng)常有香客問我,道長(zhǎng)硫戈,這世上最難降的妖魔是什么锰什? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮丁逝,結(jié)果婚禮上汁胆,老公的妹妹穿的比我還像新娘。我一直安慰自己霜幼,他們只是感情好嫩码,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罪既,像睡著了一般铸题。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上琢感,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天丢间,我揣著相機(jī)與錄音,去河邊找鬼驹针。 笑死烘挫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柬甥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撤防!你這毒婦竟也來了寄月?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤厂抖,失蹤者是張志新(化名)和其女友劉穎忱辅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橡卤,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碧库,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年嵌灰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颅悉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驹溃,死狀恐怖儒搭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搂鲫,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布拐辽,位于F島的核電站擦酌,受9級(jí)特大地震影響赊舶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜园骆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一锌唾、第九天 我趴在偏房一處隱蔽的房頂上張望晌涕。 院中可真熱鬧,春花似錦重窟、人聲如沸惧财。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋枢。三九已至瓤帚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戈次,已是汗流浹背怯邪。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悬秉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓和泌,卻偏偏與公主長(zhǎng)得像村缸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梯皿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353