1、容器啟動
Spring提供了建構Web應用程式的元件Spring MVC,通過Spring MVC和Spring Core就可以搭建一個穩定的JavaWeb項目。以下介紹Spring容器的啟動過程。
Tomcat伺服器啟動入口檔案是web.xml,通過在其中配置相關的Listener和Servlet即可加載Spring MVC所需資料。
<!-- 加載Spring配置檔案 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 加載spring mvc -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
ContextLoaderListener基于Web上下文級别的監聽器在啟動伺服器時就建立ApplicationContext并且将配置的Spring Bean加載到容器中。
DispatcherServlet是一個請求分發控制器,所有比對的URL都會通過該Servlet分發執行,在建立Servlet對象時會初始化Spring MVC相關配置。
2、ContextLoaderListener
web容器提供了一個全局的上下文環境ServletContext,為後面Spring容器提供宿主環境,在web容器啟動時會觸發容器初始化事件,ContextLoaderListener監聽到這個事件後其contextInitialized方法就會被調用,在這個方法中,spring會初始化一個根上下文,也就是WebApplicationContext,實際實作類一般是XmlWebApplicationContext,這個其實就是spring的IoC容器,Spring會将它存儲到ServletContext,可供後面擷取到該容器中的bean。
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
public ContextLoaderListener() {
}
public ContextLoaderListener(WebApplicationContext context) {
super(context);
}
public void contextInitialized(ServletContextEvent event) {
this.initWebApplicationContext(event.getServletContext());
}
public void contextDestroyed(ServletContextEvent event) {
this.closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
}
}
ContextLoaderListener源碼如上,一個構造方法,一個初始化方法contextInitialized,和一個銷毀方法contextDestroyed。initWebApplicationContext方法做了三件事:建立WebApplicationContext;加載對應的Spring檔案建立裡面的Bean執行個體;将WebApplicationContext放入ServletContext(就是Java Web的全局變量)中。
3、DispatcherServlet
在contextLoaderListener監聽器初始化完畢後,開始初始化web.xml中配置的Servlet,這個servlet可以配置多個,以DispatcherServlet為例,這個servlet實際上是一個标準的前端控制器,用以轉發、處理每個servlet請求。DispatcherServlet在初始化的時候會建立自己的IoC上下文,用以持有Spring MVC相關的Bean。在建立DispatcherServlet自己的IoC上下文時,會先從ServletContext中擷取根上下文WebApplicationContext作為自己的parent上下文。
DispatcherServlet的上下文僅僅是Spring MVC的上下文, 而ContextLoaderListener的上下文則對整個Spring都有效。ContextLoaderListener中建立ApplicationContext主要用于整個Web應用程式需要共享的一些元件,比如DAO的ConnectionFactory等。而由DispatcherServlet建立的ApplicationContext主要用于和該Servlet相關的一些元件,比如Controller、ViewResovler等。
4、Bean容器
Spring的Bean容器有BeanFactory和ApplicationContext,ApplicationContext繼承BeanFactory,功能更為強大。
ApplicationContext提供了國際化處理的支援。
BeanFactory是延遲加載,用到時才會執行個體化Bean;而ApplicationContext可配置為延遲加載,也可以配置為初始化時就執行個體化所有Bean。
ApplicationContext提供了強大的事件機制,其實作原理是基于以觀察者設計模式,通過ApplicationEvent類和ApplicationListener接口實作,如果容器中有一個ApplicationListener Bean,每當ApplicationContext釋出ApplicationEvent時,ApplicationListener Bean将自動被觸發。
ApplicationContext可以通過相對/絕對路徑通路資源,即擴充類ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。
參考資料:
https://www.cnblogs.com/rgky/p/5912320.html
https://www.cnblogs.com/weknow619/p/6341395.html