基本概念
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