BeanFactory和FactoryBean的區(qū)別_參考一
BeanFactory和FactoryBean的區(qū)別_參考二
BeanFactory和ApplicationContext的區(qū)別
ApplicationContext是BeanFactory的子接口
ApplicationContext提供了更完整的功能:
1圈膏、繼承了MessageSource矢腻,因此支持國(guó)際化。
2腺办、統(tǒng)一的資源文件訪問(wèn)方式
3菲盾、提供在監(jiān)聽(tīng)器中注冊(cè)bean的事件
4、同時(shí)加載多個(gè)配置文件
5、載入多個(gè)(有繼承關(guān)系)上下文骆撇,使得每一個(gè)上下文都專(zhuān)注于一個(gè)特定的層次,比如應(yīng)用的web層父叙。
Spring也為我們提供了多種類(lèi)型的容器實(shí)現(xiàn):
① AnnotationConfigApplicationContext:從一個(gè)或多個(gè)基于java的配置類(lèi)中加載上下文定義神郊,適用于java注解的方式;
② ClassPathXmlApplicationContext:從類(lèi)路徑下的一個(gè)或多個(gè)xml配置文件中加載上下文定義趾唱,適用于xml配置的方式涌乳;
③ FileSystemXmlApplicationContext:從文件系統(tǒng)下的一個(gè)或多個(gè)xml配置文件中加載上下文定義,也就是說(shuō)系統(tǒng)盤(pán)符中加載
④ AnnotationConfigWebApplicationContext:專(zhuān)門(mén)為web應(yīng)用準(zhǔn)備的鲸匿,適用于注解方式爷怀;
⑤ XmlWebApplicationContext:從web應(yīng)用下的一個(gè)或多個(gè)xml配置文件加載上下文定義,適用于xml配置方式带欢。
spring默認(rèn)用的是哪一個(gè)容器的實(shí)現(xiàn)呢运授?
區(qū)別:
spring bean的生命周期:
Spring Bean的生命周期流程圖:
-
(1)實(shí)例化Bean:
1、對(duì)于BeanFactory容器乔煞,當(dāng)客戶(hù)向容器請(qǐng)求一個(gè)尚未初始化的bean時(shí)吁朦,或初始化bean的時(shí)候需要注入另一個(gè)尚未初始化的依賴(lài)時(shí),容器就會(huì)調(diào)用createBean進(jìn)行實(shí)例化渡贾。
2逗宜、對(duì)于ApplicationContext容器,當(dāng)容器啟動(dòng)結(jié)束后空骚,通過(guò)獲取BeanDefinition對(duì)象中的信息纺讲,實(shí)例化所有的bean。
-
(2)設(shè)置對(duì)象屬性(依賴(lài)注入):
實(shí)例化后的對(duì)象被封裝在BeanWrapper對(duì)象中囤屹,緊接著熬甚,Spring根據(jù)BeanDefinition中的信息 以及 通過(guò)BeanWrapper提供的設(shè)置屬性的接口完成屬性設(shè)置與依賴(lài)注入。
-
(3)處理Aware接口:
Spring會(huì)檢測(cè)該對(duì)象是否實(shí)現(xiàn)了xxxAware接口肋坚,通過(guò)Aware類(lèi)型的接口乡括,可以讓我們拿到Spring容器的一些資源:
①如果這個(gè)Bean實(shí)現(xiàn)了BeanNameAware接口,會(huì)調(diào)用它實(shí)現(xiàn)的setBeanName(String beanId)方法智厌,傳入Bean的名字诲泌;
②如果這個(gè)Bean實(shí)現(xiàn)了BeanClassLoaderAware接口,調(diào)用setBeanClassLoader()方法铣鹏,傳入ClassLoader對(duì)象的實(shí)例敷扫。
②如果這個(gè)Bean實(shí)現(xiàn)了BeanFactoryAware接口,會(huì)調(diào)用它實(shí)現(xiàn)的setBeanFactory()方法诚卸,傳遞的是Spring工廠自身呻澜。
③如果這個(gè)Bean實(shí)現(xiàn)了ApplicationContextAware接口递礼,會(huì)調(diào)用setApplicationContext(ApplicationContext)方法,傳入Spring上下文羹幸;
-
(4)BeanPostProcessor前置處理:
如果想對(duì)Bean進(jìn)行一些自定義的前置處理脊髓,那么可以讓Bean實(shí)現(xiàn)了BeanPostProcessor接口,那將會(huì)調(diào)用postProcessBeforeInitialization(Object obj, String s)方法栅受。
-
(5)InitializingBean:
如果Bean實(shí)現(xiàn)了InitializingBean接口将硝,執(zhí)行afeterPropertiesSet()方法。
-
(6)init-method:
如果Bean在Spring配置文件中配置了 init-method 屬性屏镊,則會(huì)自動(dòng)調(diào)用其配置的初始化方法依疼。
-
(7)BeanPostProcessor后置處理:
如果這個(gè)Bean實(shí)現(xiàn)了BeanPostProcessor接口,將會(huì)調(diào)用postProcessAfterInitialization(Object obj, String s)方法而芥;由于這個(gè)方法是在Bean初始化結(jié)束時(shí)調(diào)用的律罢,所以可以被應(yīng)用于內(nèi)存或緩存技術(shù);
以上幾個(gè)步驟完成后棍丐,Bean就已經(jīng)被正確創(chuàng)建了误辑,之后就可以使用這個(gè)Bean了。
-
(8)DisposableBean:
當(dāng)Bean不再需要時(shí)歌逢,會(huì)經(jīng)過(guò)清理階段巾钉,如果Bean實(shí)現(xiàn)了DisposableBean這個(gè)接口,會(huì)調(diào)用其實(shí)現(xiàn)的destroy()方法秘案;
-
(9)destroy-method:
最后砰苍,如果這個(gè)Bean的Spring配置中配置了destroy-method屬性,會(huì)自動(dòng)調(diào)用其配置的銷(xiāo)毀方法阱高。
如果對(duì)bean詳細(xì)加載流程的感興趣的讀者赚导,可以閱讀這篇文章:https://blog.csdn.net/a745233700/article/details/113840727