ApplicationContext

ApplicationContext

基本功能和 beanFactory 相似,有具有負責讀取 Bean 與維護其依賴關係。

主要具備了一般企業開發所需要的功能。

Spring 作者 Rod Johnson 建議使用 ApplicationContext 來取代 BeanFactory

在 BeanFactory 生命週期,ApplicationContext 會偵測並呼叫所有實作了

ApplicationContextAware 的 bean。

經常被使用的

FileSystemXmlApplicationContext

該容器從XML文件中加載已被定義的bean。你需要提供給構造器XML文件的完整路徑。

ClassPathXmlApplicationContext

只需正確配置 classpath 參數即可,會從 classpath 中搜索 bean 配置文件。

WebXmlApplicationContext

在Web應用程式中的檔案架構中讀取定義檔。

WebApplicationContext

繼承了 ApplicationContext 介面,在專為 web 應用程式的架構中,其為 Servlet 而設計

與 ApplicationContext 不同,一個web應用程式可以有多個 WebApplicationContext

1個 DispatcherServlet 擁有1個對應的 WebApplicationContext;

每個 DispatcherServlet 有自己的 xxx-servlet.xml 設定檔; 單個web應用程式是在web.xml檔裡,設定多個 DispatcherServlet 來負責處理request。

參考: https://norilovesenbei.blogspot.com/2015/07/applicationcontext-webapplicationcontext-diff.html

與 BeanFactory 兩者差異

BeanFactory

ApplicationContext

使用懶加載

使用即時加載

使用語法顯式加載(明確指定)對象

自己創建或管理資源對象

不支持國際化

支持國際化 / 發佈事件 / AOP 集成

不支持基於依賴的註解

支持基於依賴的註解

Springboot 的環境(2.2.X)

springboot 針對 web 環境會去判斷要使用哪一種版本,透過 SpringApplication.run() 查看。

無 Web

org.springframework. context.annotation.AnnotationConfigApplicationContext

Web

org.springframework. boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext

Reactive

org.springframework. boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext

主要都是透過 AnnotationConfigRegistry 來加載註解( @Annotation )。

查看原始碼或參考: https://juejin.im/post/5b3ede18e51d4518f543c260#heading-5

參考資料

Last updated

Was this helpful?