更新時(shí)間:2022年12月28日10時(shí)25分 來源:傳智教育 瀏覽次數(shù):
BeanFactory是Spring的早期接口,稱為Spring的Bean工廠,ApplicationContext是后期更高級(jí)接口,稱之為Spring 容器;
ApplicationContext在BeanFactory基礎(chǔ)上對(duì)功能進(jìn)行了擴(kuò)展,例如:監(jiān)聽功能、國際化功能等。BeanFactory的API更偏向底層,ApplicationContext的API大多數(shù)是對(duì)這些底層API的封裝;
Bean創(chuàng)建的主要邏輯和功能都被封裝在BeanFactory中,ApplicationContext不僅繼承了BeanFactory,而且
ApplicationContext內(nèi)部還維護(hù)著BeanFactory的引用,所以,ApplicationContext與BeanFactory既有繼承關(guān)系,又有融合關(guān)系。
Bean的初始化時(shí)機(jī)不同,原始BeanFactory是在首次調(diào)用getBean時(shí)才進(jìn)行Bean的創(chuàng)建,而ApplicationContext則是配置文件加載,容器一創(chuàng)建就將Bean都實(shí)例化并初始化好。
ApplicationContext除了繼承了BeanFactory外,還繼承了ApplicationEventPublisher(事件發(fā)布器)、ResouresPatternResolver(資源解析器)、MessageSource(消息資源)等。但是ApplicationContext的核心功能還是BeanFactory。
BeanFactory與ApplicationContext的關(guān)系圖如下:
applicationContext內(nèi)部維護(hù)著beanFactory的引用,在學(xué)習(xí)過程中會(huì)查看beanFactory內(nèi)部維護(hù)的屬性,斷點(diǎn)查看如下圖示內(nèi)容的。
驗(yàn)證BeanFactory和ApplicationContext對(duì)Bean的初始化時(shí)機(jī),在UserDaoImpl的無參構(gòu)造內(nèi)打印一句話,驗(yàn)證構(gòu)造方法的執(zhí)行時(shí)機(jī)。
public class UserDaoImpl implements UserDao { public UserDaoImpl() { System.out.println("UserDaoImpl創(chuàng)建了..."); } }
斷點(diǎn)觀察,BeanFactory方式時(shí),當(dāng)調(diào)用getBean方法時(shí)才會(huì)把需要的Bean實(shí)例創(chuàng)建,即延遲加載;而 ApplicationContext是加載配置文件,容器創(chuàng)建時(shí)就將所有的Bean實(shí)例都創(chuàng)建好了,存儲(chǔ)到一個(gè)單例池中,當(dāng)調(diào)用getBean時(shí)直接從單例池中獲取Bean實(shí)例返回。
北京校區(qū)