IOC(控制反轉)/DI(依賴注入)容器概述

Spring的豐富功能都是基于其兩大核心特性:

  1. 控制翻轉(IOC)/依賴注入(Dependency Injection伺帘,DI)
  2. 面向切面編程(Aspect-Oriented Programming, AOP)

IOC/DI容器解決了對象的創(chuàng)建,及對象之間的裝配忌锯。使得應用組件不再需要顯式創(chuàng)建和管理其依賴的組件,只需要聲明自己依賴的組件即可偶垮。而依賴組件的創(chuàng)建和注入則交給了IOC/DI容器张咳。
通過DI,對象的依賴關系將由系統(tǒng)中的負責協(xié)調(diào)各對象的第三方組件在創(chuàng)建對象的時候進行設定似舵。

1. DI--降低耦合脚猾、整潔、易理解砚哗、易測試

通常應用由多個相互協(xié)作的組件共同完成業(yè)務邏輯龙助。按傳統(tǒng)做法,組件負責創(chuàng)建其依賴的對象频祝,并管理其依賴的對象的引用泌参,這會導致組件類和依賴的緊耦合。
而使用了IOC/DI容器后常空,組件類通過(1)依賴接口(而不是具體實現(xiàn))沽一,以及(2)將依賴的創(chuàng)建交給容器,使得組件類不再依賴于具體實現(xiàn)漓糙,從而實現(xiàn)組件類和其依賴對象的解耦(組件類的import中只有依賴的接口铣缠,沒有依賴接口的具體實現(xiàn)),并且組件類的代碼也變得更加整潔昆禽。
將依賴的創(chuàng)建分離出來后蝗蛙,依賴的創(chuàng)建方式的變化也不會影響到組件類,使得依賴類更容易變更醉鳖。
另外捡硅,使組件類依賴接口,也使得測試更加容易盗棵,組件類和其依賴類可以分開測試壮韭。

2. Spring IOC容器

2.1 應用對象由Spring容器管理

在基于Spring的應用中北发,你的應用對象生存于Spring容器中。
Spring容器負責創(chuàng)建喷屋、裝配對象琳拨,并管理對象從生存到死亡的整個生命周期。
可以通過配置來告訴容器如何創(chuàng)建和組裝對象屯曹。

2.2 Spring的容器類別和常用容器

Spring容器可以分為兩類:Bean工廠 和 應用上下文狱庇。

  • Bean工廠(BeanFactory)
    org.springframework.beans.factory.BeanFactory 提供Bean的創(chuàng)建、獲取等基本功能恶耽,還提供BFPP密任、BPP等擴展。

  • 應用上下文 (ApplicationContext)
    org.springframework.context.ApplicationContext 基于BeanFactory構建驳棱,提供應用框架級服務批什,在Bean基礎上增加了事件發(fā)布农曲、消息源等功能社搅。

常用應用上下文類:

  • AnnotationConfigurationApplicationContext 、AnnotationConfigurationWebApplicationContext:
    從一個或多個基于Java的配置類中加載Spring上下文乳规。(推薦方式)配置類經(jīng)常會使用@ComponentScan實現(xiàn)組件自動掃描形葬。

  • ClasspathXmlApplicationContext、XmlWebApplicationContext:
    從一個或多個基于Xml的配置文件中加載Spring上下文暮的。

2.3 容器中Bean的生命周期

根據(jù)AbstractApplicationContext的refresh()函數(shù)笙以,可以得到容器中Bean的聲明周期。主要包括如下階段(包含Bean創(chuàng)建前的處理):

// 忽略了無關代碼
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
      throws BeanCreationException {

   // Instantiate the bean.
   BeanWrapper instanceWrapper = null;
   if (instanceWrapper == null) {
       // 實例化階段冻辩!
      instanceWrapper = createBeanInstance(beanName, mbd, args);
   }

   // Initialize the bean instance.
   Object exposedObject = bean;
   try {
       // 屬性賦值階段猖腕!
      populateBean(beanName, mbd, instanceWrapper);
       // 初始化階段!
      exposedObject = initializeBean(beanName, exposedObject, mbd);
   }

   
   }

1. Bean工廠后處理(invokeBeanFactoryPostProcessors)

  • 實例化并執(zhí)行 BeanFactoryPostProcessor.postProcessBeanFactory() 方法

2. Bean實例化(Instantiation)

  • 應用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
  • 實例化Bean(createBeanInstance)

3. 屬性填充(populateBean)

  • 應用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
  • 填充值或依賴

4. 初始化(initializeBean)

  • 順序調(diào)用Aware方法
  • 應用BeanPostProcessor.postProcessBeforeInitialization
  • 執(zhí)行初始化方法(順序如下)
    1. @PostConstruct
    2. InitializingBean.afterPropertiesSet()
    3. 自定義"init"方法
  • 應用BeanPostProcessor.postProcessAfterInitialization

5. 銷毀

  • 執(zhí)行銷毀方法(順序如下)
    1. @PreDestroy
    2. DisposableBean.destroy()
    3. 自定義"destroy"方法

參考《Spring實戰(zhàn)第4版》
http://www.reibang.com/p/1dec08d290c1(請別再問Spring Bean的生命周期了:奚痢)
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-lifecycle-combined-effects (初始化倘感、銷毀方法執(zhí)行順序)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咙咽,隨后出現(xiàn)的幾起案子老玛,更是在濱河造成了極大的恐慌,老刑警劉巖钧敞,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜡豹,死亡現(xiàn)場離奇詭異,居然都是意外死亡溉苛,警方通過查閱死者的電腦和手機镜廉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愚战,“玉大人娇唯,你說我怎么就攤上這事威根。” “怎么了视乐?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵洛搀,是天一觀的道長。 經(jīng)常有香客問我佑淀,道長留美,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任伸刃,我火速辦了婚禮谎砾,結果婚禮上,老公的妹妹穿的比我還像新娘捧颅。我一直安慰自己景图,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布碉哑。 她就那樣靜靜地躺著挚币,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扣典。 梳的紋絲不亂的頭發(fā)上妆毕,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音贮尖,去河邊找鬼笛粘。 笑死,一個胖子當著我的面吹牛湿硝,可吹牛的內(nèi)容都是我干的薪前。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼关斜,長吁一口氣:“原來是場噩夢啊……” “哼示括!你這毒婦竟也來了?” 一聲冷哼從身側響起蚤吹,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤例诀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裁着,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體繁涂,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年二驰,在試婚紗的時候發(fā)現(xiàn)自己被綠了扔罪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡桶雀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情下梢,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布敞咧,位于F島的核電站,受9級特大地震影響辜腺,放射性物質發(fā)生泄漏休建。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一评疗、第九天 我趴在偏房一處隱蔽的房頂上張望测砂。 院中可真熱鬧,春花似錦百匆、人聲如沸砌些。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽存璃。三九已至,卻和暖如春矩动,著一層夾襖步出監(jiān)牢的瞬間有巧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工悲没, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人男图。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓示姿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逊笆。 傳聞我的和親對象是個殘疾皇子栈戳,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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