天天看點

Spring來一發(一)Spring容器

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

繼續閱讀