控制反轉(IOC--Inversion of control)

控制反轉(IOC--Inversion of control)

所謂控制反轉就是應用本身不負責依賴對象的創(chuàng)建及維護,依賴對象的創(chuàng)建及維護是由外部容器負責的谭胚。這樣控制權就由應用轉移到了外部容器没陡,控制權的轉移就是所謂反轉

Spring的控制反轉:
把對象的創(chuàng)建遭贸、初始化隐绵、銷毀等工作交給spring容器來做。由spring容器控制對象的生命周期呀页。
    步驟:
A.  啟動spring容器
1、在類路徑下尋找配置文件來實例化容器 
ApplicationContext ctx = new ClassPathXmlApplicationContext(" xxx.xml");
可以在整個類路徑中尋找xml文件
* 通過這種方式加載拥坛。需要將spring的配置文件放到當前項目的classpath路徑下
*  classpath路徑指的是當前項目的src目錄蓬蝶,該目錄是java源文件的存放位置。 

例如:
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

2渴逻、在文件系統(tǒng)路徑下尋找配置文件來實例化容器 
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]{“d:\\beans.xml“});
Spring的配置文件可以指定多個疾党,可以通過String數(shù)組傳入。

注:經(jīng)常用第一種方法啟動容器
B.  從spring容器中提取對象
別名
通過這樣的配置惨奕,可以達到在一個地方命名雪位,在多個地方使用不同的名字的效果。
創(chuàng)建對象三種的方式

無參構造函數(shù)

無參構造函數(shù)
<bean id="helloWorld" class="com.hw.entity.HelloWorldFactory" >
</bean>

靜態(tài)工廠

public class HelloWorld {
    public void hello() {
        System.out.println("哈哈");   
    }
}
--------------------------------------------
public class HelloWorldFactory {
    public static HelloWorld getFactory() {
        return new HelloWorld();
    }
}
---------------------------------------------------
<bean id="helloWorld2" class="com.hw.entity.HelloWorldFactory" factory-method="getFactory"></bean>

    @Test
    public void test001() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloWorld hello = (HelloWorld) ac.getBean("helloWorld2");
        hello.hello();
    }
}

實例工廠

public class HelloWorld {
    public void hello() {
        System.out.println("哈哈");   
    }
}

public class HelloWorldFactory {
    public HelloWorld getFactory() {
        return new HelloWorld();
    }
}

<bean id="helloWorld" class="com.hw.entity.HelloWorldFactory" ></bean>
<bean id="helloWorld3" factory-bean="helloWorld" factory-method="getFactory"></bean>

    @Test
    public void test001() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloWorld hello = (HelloWorld) ac.getBean("helloWorld2");
        hello.hello();
    }
}

Bean的作用域 ,對象的scope

五種:

1.singleton:單例模式
singleton(默認值)
在每個Spring IoC容器中一個bean定義只有一個對象實例(共享)梨撞。

默認情況下會在容器啟動時初始化bean雹洗,但我們可以指定Bean節(jié)點的lazy-init=“true”來延遲初
始化bean,這時候卧波,只有第一次獲取bean會才初始化bean时肿。如:
<bean id="xxx" class="com.xxx.xxx" lazy-init="true"/>

如果想對所有bean都應用延遲初始化,可以在根節(jié)點beans設置default-lazy-init=“true“港粱,
2.prototype:原型模式
允許bean可以被多次實例化(使用一次就創(chuàng)建一個實例) . Spring不能對一個prototype bean的
整個生命周期負責.這就意味著清楚prototype作用域的對象并釋放任何prototype bean所持有的
昂貴資源都是客戶端的責任螃成。
3.request
4.session
5.global session

初始化bean時機

Spring默認在啟動時將所有singleton bean提前進行實例化。提前實例化意味著作為初始化的一
部分查坪,ApplicationContext會自動創(chuàng)建并配置所有的singleton bean.通常情況下這是件好事寸宏。
因為這樣在配置中有任何錯誤能立即發(fā)現(xiàn)。

Lazy-init 為false,spring容器將在啟動的時候報錯(比較好的一種方式)
Lazy-init 為true,spring容器將在調用該類的時候出錯偿曙。

如果scope為prototype, Lazy-init將失去作用 

init氮凝、destroy
Spring初始化bean或銷毀bean時,有時需要作一些處理工作望忆,因此spring可以在創(chuàng)建和拆卸bean的時候調用bean
的兩個生命周期方法罩阵。

public class HelloWorld {
    public HelloWorld() {
        System.out.println("new instance");
    }

    public void init() {
        System.out.println("init");
    }

    public void destroy() {
        System.out.println("detroy");
    }

    public void hello() {
        System.out.println("哈哈");
    }
}
-----------------------------------------------
<bean id="helloWorld" class="com.hw.entity.HelloWorld"
        init-method="init" destroy-method="destroy" scope="prototype">
</bean>
---------------------------------------------------------
    @Test
    public void test001() {
        ApplicationContext context = new 
                ClassPathXmlApplicationContext("applicationContext.xml");
        
        HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
        
        helloWorld.hello();
        
        ClassPathXmlApplicationContext applicationContext = 
                (ClassPathXmlApplicationContext)context;
        
        applicationContext.close();
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末竿秆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子稿壁,更是在濱河造成了極大的恐慌幽钢,老刑警劉巖鹉勒,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绊率,死亡現(xiàn)場離奇詭異顷帖,居然都是意外死亡蘑秽,警方通過查閱死者的電腦和手機捺信,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門蒿涎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜕便,“玉大人签赃,你說我怎么就攤上這事溃斋〗缋梗” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵梗劫,是天一觀的道長享甸。 經(jīng)常有香客問我,道長梳侨,這世上最難降的妖魔是什么蛉威? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮走哺,結果婚禮上蚯嫌,老公的妹妹穿的比我還像新娘。我一直安慰自己丙躏,他們只是感情好择示,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晒旅,像睡著了一般栅盲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上废恋,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天谈秫,我揣著相機與錄音,去河邊找鬼鱼鼓。 笑死孝常,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蚓哩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼上渴,長吁一口氣:“原來是場噩夢啊……” “哼岸梨!你這毒婦竟也來了喜颁?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤曹阔,失蹤者是張志新(化名)和其女友劉穎半开,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赃份,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寂拆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抓韩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纠永。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谒拴,靈堂內的尸體忽然破棺而出尝江,到底是詐尸還是另有隱情,我是刑警寧澤英上,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布炭序,位于F島的核電站,受9級特大地震影響苍日,放射性物質發(fā)生泄漏惭聂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一相恃、第九天 我趴在偏房一處隱蔽的房頂上張望辜纲。 院中可真熱鬧,春花似錦豆茫、人聲如沸侨歉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幽邓。三九已至,卻和暖如春火脉,著一層夾襖步出監(jiān)牢的瞬間牵舵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工倦挂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畸颅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓方援,卻偏偏與公主長得像没炒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子犯戏,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348