四:spring容器

概念

Spring容器里裝的是需要管理的對象榕茧,裝在一個HashMap集合中覆旱。我們用容器來實例化對象饭玲,管理對象之間的依賴
只要實現(xiàn)了BeanFactory和ApplicationContext接口的類醉冤,那么這兩個接口的類都可以作為Spring容器

BeanFactory

是最頂層最基本的接口卫袒,它描述了容器需要實現(xiàn)的最基本的功能

ApplicationContext

繼承了BeanFactory接口宵呛,它描述的內(nèi)容更加廣泛。它是把beans.xml文件里的內(nèi)容先存放到HashMap容器里夕凝,需要用的時候從里面取烤蜕,用得最多

實例化Bean的三種方式

在 Spring 中,構(gòu)成應(yīng)用程序主干并由 Spring IoC 容器管理的對象稱為 bean迹冤。bean 是由Spring IoC 容器實例化讽营、組裝和管理的對象

1)使用默認(rèn)無參構(gòu)造函數(shù)

在默認(rèn)情況下,它會根據(jù)默認(rèn)無參構(gòu)造函數(shù)來創(chuàng)建類對象泡徙,如果bean中沒有默認(rèn)無參構(gòu)造函數(shù)橱鹏,將會創(chuàng)建失敗

beans.xml文件中            
<bean id="accountDao" class="xn.xh.dao.impl.AccountDaoImpl"/>           
            
AccountDaoImpl.java文件中          
public class AccountDaoImpl implements IAccountDao {            
    //無參構(gòu)造函數(shù)。如果一個類沒有定義任何的構(gòu)造函數(shù),那么會自動生成一個無參構(gòu)造函數(shù)       
    public AccountDaoImpl() {       
        System.out.println("創(chuàng)建了對象!");   
    }   

   ===========================================================
    //如果上面這個代碼改成下面這樣莉兰,執(zhí)行client時就會報錯
    public AccountDaoImpl(String name) {    
    System.out.println("創(chuàng)建了對象!");
    }   
   ===========================================================
    
    @Override       
    public void saveAccount() {     
        System.out.println("jdbc保存賬戶!");    
    }       
}           
            
            
client.java文件中          
public class client {           
    public static void main(String[] args) {        
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");   
        IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");    
        accountDao.saveAccount();   
        //運行結(jié)果為在控制臺打印出:創(chuàng)建了對象! Jdbc保存賬戶! 
    }       
}           

2)spring管理靜態(tài)工廠挑围,使用靜態(tài)工廠的方法創(chuàng)建對象

模擬一個靜態(tài)工廠,創(chuàng)建數(shù)據(jù)層實現(xiàn)類

beans.xml文件中                    
<bean id="accountDao" class="xn.xh.factory.StaticFactory" factory-method="createAccountDao" />                  
                    
AccountDaoImpl.java文件中                  
public class AccountDaoImpl implements IAccountDao {                    
    public AccountDaoImpl() {               
        System.out.println("創(chuàng)建了對象!");           
    }               
    @Override               
    public void saveAccount() {             
        System.out.println("jdbc保存賬戶!");            
    }               
}                   
                    
                    
StaticFactory文件中                    
public class StaticFactory {                    
    public static IAccountDao createAccountDao() {              
        return new AccountDaoImpl();            
    }               
}                   
                    
client.java文件中                  
public class client {                   
    public static void main(String[] args) {                
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");           
        IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");            
        accountDao.saveAccount();           
        //運行結(jié)果為在控制臺打印出:創(chuàng)建了對象! Jdbc保存賬戶!         
    }               
}                   

執(zhí)行過程解析

此種方法是
使用StaticFactory類中的靜態(tài)方法createAccountDao創(chuàng)建對象糖荒,并存入spring容器
id屬性:指定bean的id杉辙,用于從容器中獲取
class屬性:指定靜態(tài)工廠的全限定類名
factory-method屬性:指定生產(chǎn)對象的靜態(tài)方法

3)spring管理實例工廠-使用實例工廠的方法創(chuàng)建對象

模擬一個實例工廠,創(chuàng)建業(yè)務(wù)層實現(xiàn)類
次工廠創(chuàng)建對象捶朵,必須有工廠實例對象蜘矢,再調(diào)用方法

beans.xml文件中                                            
<bean id="InstanceFactory" class="xn.xh.factory.InstanceFactory" />                                         
<bean id="accountDao" factory-bean="InstanceFactory" factory-method="createAccountDao" />                                           
                                            
AccountDaoImpl.java文件中                                          
public class AccountDaoImpl implements IAccountDao {                                            
    public AccountDaoImpl() {                                       
        System.out.println("創(chuàng)建了對象!");                                   
    }                                       
    @Override                                       
    public void saveAccount() {                                     
        System.out.println("jdbc保存賬戶!");                                    
    }                                       
}                                           
                                            
InstanceFactory.java文件中                                         
public class InstanceFactory {                                          
    public IAccountDao createAccountDao() {                                     
        return new AccountDaoImpl();                                    
    }                                       
}                                           
                                            
client.java文件中                                          
public class client {                                           
    public static void main(String[] args) {                                        
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");                                   
        IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");                                    
        accountDao.saveAccount();                                   
        //運行結(jié)果為在控制臺打印出:創(chuàng)建了對象! Jdbc保存賬戶!                                 
    }                                       
}                                           

執(zhí)行過程解析

2)和3)那么麻煩,為什么不只用1)的方法進(jìn)行創(chuàng)建實例對象呢综看? 比如上面工廠(InstanceFactory類)是第三方的jar包品腹,我們無法修改里面的代碼,但又想通過它來生成實例對象時就要用到了

bean標(biāo)簽

作用

用于配置對象讓spring來創(chuàng)建的

屬性

id:給對象在容器中提供一個唯一標(biāo)識红碑,用于獲取對象
class:指定類的全限定類名舞吭,用于反射創(chuàng)建對象
scope:指定對象的作用范圍
?singleton:默認(rèn)值,單例的
?prototype:多例的
?request:web項目中Spring創(chuàng)建一個Bean的對象析珊,將對象存入到request域中
?session:web項目中Spring創(chuàng)建一個Bean的對象羡鸥,將對象存入到session域中

bean的作用范圍和生命周期
單例對象

scope=“singleton”
一個應(yīng)用只有一個對象的實例,它的作用范圍就是整個引用
在加載beans.xml文件的時候創(chuàng)建對象忠寻,放入到HashMap集合當(dāng)中惧浴,只會被創(chuàng)建一次。用getBean()方法調(diào)用的時候直接去集合里取
生命周期
?對象出生:當(dāng)應(yīng)用加載锡溯,創(chuàng)建容器時赶舆,對象就被創(chuàng)建了
?對象活著:只要容器在哑姚,對象一直活著
?對象死亡:當(dāng)應(yīng)用卸載祭饭,銷毀容器時,對象就會被銷毀

多例對象

scope="prototype"
每次訪問對象時叙量,都會重新創(chuàng)建對象實例
生命周期
?對象出生:當(dāng)使用對象時倡蝙,創(chuàng)建新的對象實例
?對象活著:只要對象在使用中,就一直活著
?對象死亡:當(dāng)對象長時間不用時绞佩,被java的垃圾回收器回收了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寺鸥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子品山,更是在濱河造成了極大的恐慌胆建,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肘交,死亡現(xiàn)場離奇詭異笆载,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門凉驻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腻要,“玉大人,你說我怎么就攤上這事涝登⌒奂遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵胀滚,是天一觀的道長趟济。 經(jīng)常有香客問我,道長蛛淋,這世上最難降的妖魔是什么咙好? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮褐荷,結(jié)果婚禮上勾效,老公的妹妹穿的比我還像新娘。我一直安慰自己叛甫,他們只是感情好层宫,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著其监,像睡著了一般萌腿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抖苦,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天毁菱,我揣著相機(jī)與錄音,去河邊找鬼锌历。 笑死贮庞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的究西。 我是一名探鬼主播窗慎,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卤材!你這毒婦竟也來了遮斥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扇丛,失蹤者是張志新(化名)和其女友劉穎术吗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帆精,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡较屿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年材蹬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吝镣。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡堤器,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出末贾,到底是詐尸還是另有隱情闸溃,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布拱撵,位于F島的核電站辉川,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拴测。R本人自食惡果不足惜乓旗,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望集索。 院中可真熱鬧屿愚,春花似錦、人聲如沸务荆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽函匕。三九已至娱据,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盅惜,已是汗流浹背中剩。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留抒寂,地道東北人结啼。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蓬推,于是被迫代替她去往敵國和親妆棒。 傳聞我的和親對象是個殘疾皇子澡腾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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