SpringIOC

基本概念

IoC是什么惹盼?

如果這個問題要是面試的問題的榛,那么我會這么回答。

IoC(Inversion of Control 控制反轉(zhuǎn))逻锐,當(dāng)然它還有另一個名字夫晌,DI(Dependency Injection 依賴注入)。這兩個名稱其實(shí)實(shí)質(zhì)上指的都是同一樣的東西昧诱。只不過看問題的角度是不一樣的晓淀。IoC指的是,原來我們需要獲得一個對象(Object)的時候盏档,我們的第一想法就是用new凶掰。搭配下圖,效果更好蜈亩。


為什么要使用IoC懦窘?

現(xiàn)在我們不用new了,是別人給我們的稚配。既然是別人給的畅涂,那么,別人可以給道川,也可以不給午衰。主動權(quán)這個時候,肯定就不在我們自己的手里了冒萄,在別人的手里了臊岸。所以,名叫IoC尊流,控制反轉(zhuǎn)帅戒。


為什么要使用IoC?

至于為什么要使用IoC崖技,不用自己new逻住,我說說自己的看法施流。


Person person= new Asian("Alibaba");

看看,上面的代碼可以看出鄙信,我們需要一個Person瞪醋,這個person,我們選擇new出來装诡。但實(shí)際上new的不是Person本身银受,而是其繼承類,Asian鸦采。那如果有一天這個叫Alibaba的亞洲人宾巍,不這么想了。程序需要更精確些渔伯。是不是要改成下面這樣的顶霞。

Person person=new Chinese("Alibaba");

那如果改的地方其實(shí)還挺多的呢,我們的應(yīng)用還大呢锣吼?【一般公司的應(yīng)用选浑,都不會小】你還一個個去new,去改嗎玄叠?

這時候就體現(xiàn)出IoC的優(yōu)勢了古徒,即別人幫你管要new的東西,在Spring的配置文件里面改就好了读恃,給你的這部分代碼是不用改的隧膘。我們來看看

//讀取bean.xml中的內(nèi)容ApplicationContext ctx =newClassPathXmlApplicationContext("beans.xml");//創(chuàng)建bean的引用對象Person p = ctx.getBean("person");

當(dāng)然,以上的代碼并不難寺惫,實(shí)際中疹吃,我們很有可能也不這么用。但是西雀,本質(zhì)的意思總歸是這個意思的萨驶。

我說了這么多,其實(shí)就只為了體現(xiàn)一個IoC的優(yōu)勢蒋搜。

==資源集中管理篡撵,實(shí)現(xiàn)資源的可配置和易管理判莉。==

這是我畫的有關(guān)IoC Provider與其他POJO類的關(guān)系圖豆挽,其實(shí)本來,Person擁有Pets券盅,Person和Pets都擁有Life是一件再平常不過的事兒帮哈。所以原來他們的關(guān)系是很緊密的,后來有了IoC Provider之后锰镀,就把這三者緊密聯(lián)系的類分開了娘侍。而且咖刃,其實(shí)分的很開。

你要問憾筏,這又有什么優(yōu)勢嚎杨?看來還是不行啊,還是要整代碼氧腰。

Person person=newAsian("Alibaba");person.setPet=newDog("Lili");person.setLife=newLife("good");

那我dog改成cat呢枫浙,Life改成bad呢?代碼的耦合性很強(qiáng)古拴,一個改箩帚,個個改。這不就很麻煩嗎黄痪?如果把bean的管理都交給IoC紧帕,那就是IoC幫你管,要變化桅打,IoC變化了之后再給你是嗜。不就不用你操心了嗎?這還不算優(yōu)勢嗎挺尾?

優(yōu)勢總結(jié)

1叠纷、 資源集中管理,實(shí)現(xiàn)資源的可配置和易管理潦嘶。

2涩嚣、降低了使用資源雙方的依賴程度,解耦掂僵。

pring還給我們提供了接口航厚,干什么呢?如果你想搞些事情呢锰蓬?那我不能讓你搞幔睬,豈不是很不好。開源框架嘛芹扭,拓展性非常重要麻顶。

接口--BeanFactoryPostProcessor就是做這個工作的,其中有幾個Spring自帶的舱卡,挺有用的BeanFactoryPostProcessor辅肾。

① PropertyPlaceHolderConfigurer

從這個類圖上就可以看到,PropertyPlaceholderConfigurer間接實(shí)現(xiàn)了BeanFactoryPostprocessor轮锥。是Spring自帶的搞事情實(shí)現(xiàn)類矫钓。

【主要功能】

為什么叫PropertyPlaceHolderConfigurer,PlaceHolder就叫做占位符,所以這個Configurer主要的功能特點(diǎn)新娜,就是占位符相關(guān)的赵辕。例如,以下我們這種常見的應(yīng)用概龄。

很常見吧还惠,我們不直接寫值,而是寫占位符私杜,然后在其他地方我們再去寫值吸重。當(dāng)然,要用它歪今,必須要把它加上


小課堂的問題

1.BeanFactory和ApplicationContext有什么區(qū)別嚎幸?

BeanFactory 可以理解為含有bean集合的工廠類。BeanFactory 包含了種bean的定義寄猩,以便在接收到客戶端請求時將對應(yīng)的bean實(shí)例化嫉晶。

BeanFactory還能在實(shí)例化對象的時生成協(xié)作類之間的關(guān)系。此舉將bean自身與bean客戶端的配置中解放出來田篇。BeanFactory還包含了bean生命周期的控制替废,調(diào)用客戶端的初始化方法(initialization methods)和銷毀方法(destruction methods)。

從表面上看泊柬,application context如同bean factory一樣具有bean定義椎镣、bean關(guān)聯(lián)關(guān)系的設(shè)置,根據(jù)請求分發(fā)bean的功能兽赁。但application context在此基礎(chǔ)上還提供了其他的功能状答。

提供了支持國際化的文本消息

統(tǒng)一的資源文件讀取方式

已在監(jiān)聽器中注冊的bean的事件

以下是三種較常見的 ApplicationContext 實(shí)現(xiàn)方式:

1、ClassPathXmlApplicationContext:從classpath的XML配置文件中讀取上下文刀崖,并生成上下文定義惊科。應(yīng)用程序上下文從程序環(huán)境變量中取得。

ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);

2亮钦、FileSystemXmlApplicationContext :由文件系統(tǒng)中的XML配置文件讀取上下文馆截。

ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);

3、XmlWebApplicationContext:由Web應(yīng)用的XML文件讀取上下文蜂莉。


2.Spring有幾種配置方式蜡娶?

基于XML的配置

基于注解的配置

基于Java的配置

基于Groovy DSL的配置


3.Spring Bean的作用域之間有什么區(qū)別?

Spring容器中的bean可以分為5個范圍

singleton:這種bean范圍是默認(rèn)的映穗,這種范圍確保不管接受到多少個請求窖张,每個容器中只有一個bean的實(shí)例,單例的模式由bean factory自身來維護(hù)男公。

prototype:原形范圍與單例范圍相反荤堪,為每一個bean請求提供一個實(shí)例合陵。

request:在請求bean范圍內(nèi)會每一個來自客戶端的網(wǎng)絡(luò)請求創(chuàng)建一個實(shí)例枢赔,在請求完成以后澄阳,bean會失效并被垃圾回收器回收。

Session:與請求范圍類似踏拜,確保每個session中有一個bean的實(shí)例碎赢,在session過期后,bean會隨之失效速梗。

global-session:global-session和Portlet應(yīng)用相關(guān)肮塞。當(dāng)你的應(yīng)用部署在Portlet容器中工作時,它包含很多portlet姻锁。如果你想要聲明讓所有的portlet共用全局的存儲變量的話枕赵,那么這全局變量需要存儲在global-session中。

全局作用域與Servlet中的session作用域效果相同位隶。

4.請解釋自動裝配模式的區(qū)別拷窜?

在Spring框架中共有5種自動裝配.

1. no:這是Spring框架的默認(rèn)設(shè)置,在該設(shè)置下自動裝配是關(guān)閉的涧黄,開發(fā)者需要自行在bean定義中用標(biāo)簽明確的設(shè)置依賴關(guān)系篮昧。

2. byName:該選項(xiàng)可以根據(jù)bean名稱設(shè)置依賴關(guān)系。當(dāng)向一個bean中自動裝配一個屬性時笋妥,容器將根據(jù)bean的名稱自動在在配置文件中查詢一個匹配的bean懊昨。如果找到的話,就裝配這個屬性春宣,如果沒找到的話就報(bào)錯酵颁。

3. byType:該選項(xiàng)可以根據(jù)bean類型設(shè)置依賴關(guān)系。當(dāng)向一個bean中自動裝配一個屬性時月帝,容器將根據(jù)bean的類型自動在在配置文件中查詢一個匹配的bean材义。如果找到的話,就裝配這個屬性嫁赏,如果沒找到的話就報(bào)錯其掂。

4. constructor:造器的自動裝配和byType模式類似,但是僅僅適用于與有構(gòu)造器相同參數(shù)的bean潦蝇,如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的bean款熬,那么將會拋出異常。

5. autodetect:該模式自動探測使用構(gòu)造器自動裝配或者byType自動裝配攘乒。首先贤牛,首先會嘗試找合適的帶參數(shù)的構(gòu)造器,如果找到的話就是用構(gòu)造器自動裝配则酝,如果在bean內(nèi)部沒有找到相應(yīng)的構(gòu)造器或者是無參構(gòu)造器殉簸,容器就會自動選擇byTpe的自動裝配方式。

5.請舉例解釋@Autowired注解?

@Autowired注解對自動裝配何時何處被實(shí)現(xiàn)提供了更多細(xì)粒度的控制般卑。@Autowired注解可以像@Required注解武鲁、構(gòu)造器一樣被用于在bean的設(shè)值方法上自動裝配bean的屬性,一個參數(shù)或者帶有任意名稱或帶有多個參數(shù)的方法蝠检。比如沐鼠,可以在設(shè)值方法上使用@Autowired注解來替代配置文件中的元素。當(dāng)Spring容器在setter方法上找到@Autowired注解時叹谁,會嘗試用byType 自動裝配饲梭。


更詳細(xì)的請看視頻視頻


PPT?PPT

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市焰檩,隨后出現(xiàn)的幾起案子憔涉,更是在濱河造成了極大的恐慌,老刑警劉巖析苫,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兜叨,死亡現(xiàn)場離奇詭異,居然都是意外死亡藤违,警方通過查閱死者的電腦和手機(jī)浪腐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顿乒,“玉大人议街,你說我怎么就攤上這事¤甸” “怎么了特漩?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骨杂。 經(jīng)常有香客問我涂身,道長,這世上最難降的妖魔是什么搓蚪? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任蛤售,我火速辦了婚禮,結(jié)果婚禮上妒潭,老公的妹妹穿的比我還像新娘悴能。我一直安慰自己,他們只是感情好雳灾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布漠酿。 她就那樣靜靜地躺著,像睡著了一般谎亩。 火紅的嫁衣襯著肌膚如雪炒嘲。 梳的紋絲不亂的頭發(fā)上宇姚,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音夫凸,去河邊找鬼浑劳。 笑死,一個胖子當(dāng)著我的面吹牛寸痢,可吹牛的內(nèi)容都是我干的呀洲。 我是一名探鬼主播紊选,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼啼止,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兵罢?” 一聲冷哼從身側(cè)響起献烦,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卖词,沒想到半個月后巩那,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡此蜈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年即横,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裆赵。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡东囚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出战授,到底是詐尸還是另有隱情页藻,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布植兰,位于F島的核電站份帐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏楣导。R本人自食惡果不足惜废境,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筒繁。 院中可真熱鬧噩凹,春花似錦、人聲如沸膝晾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽血当。三九已至幻赚,卻和暖如春禀忆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背落恼。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工箩退, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佳谦。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓戴涝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钻蔑。 傳聞我的和親對象是個殘疾皇子啥刻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)咪笑,斷路器可帽,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,461評論 1 133
  • 這部分主要是開源Java EE框架方面的內(nèi)容窗怒,包括Hibernate映跟、MyBatis、Spring扬虚、Spring ...
    雜貨鋪老板閱讀 1,367評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法努隙,類相關(guān)的語法,內(nèi)部類的語法辜昵,繼承相關(guān)的語法荸镊,異常的語法,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • 每當(dāng)東方九型班有石家莊代表團(tuán)的成員在時路鹰,沒去現(xiàn)場的其他成員就會特別關(guān)注贷洲,這次也不例外,許敏去了晋柱。這次大家的探討程度...
    潘潘_1w9閱讀 416評論 3 4