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