spring容器啟動之我見(一)
來源:程序員人生 發布時間:2015-04-29 08:17:21 閱讀次數:3493次
spring容器啟動之我見。
本人也是自己看看源碼,然后方便以后自己記憶和理解,故寫此文章,如果有甚么錯的地方還請大家提出。
針對tomcat做
服務器的項目,我們首先看的就
是web.xml文件,spring容器啟動去加載監聽器
看以下代碼:其監聽器使用spring api中的類ContextLoaderListener
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value> classpath*:/spring-*.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>production</param-value>
</context-param>
<listener>
<listener-class>org.szgzw.frame.web.CGYContextLoaderListener</listener-class>
<!-- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> -->
</listener>
視察上面發現 這里我們自己寫了1個監聽類
CGYContextLoaderListener,
我們先來了解 spring api 中的ContextLoaderListener 類
ContextLoaderListener監聽器的作用就是啟動Web容器時,自動裝配ApplicationContext的配置信息。由于它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啟動容器時,就會默許履行它實現的方法。至于ApplicationContext.xml這個配置文件部署在哪,如何配置多個xml文件,書上都沒怎樣詳細說明。現在的方法就是查看它的API文檔。在ContextLoaderListener中關聯了ContextLoader這個類,所以全部加載配置進程由ContextLoader來完成。看看它的API說明。
第1段說明ContextLoader可以由 ContextLoaderListener和ContextLoaderServlet生成。如果查看ContextLoaderServlet的API,可以看到它也關聯了ContextLoader這個類而且它實現了HttpServlet這個接口。
第2段,ContextLoader創建的是 XmlWebApplicationContext這樣1個類,它實現的接口是WebApplicationContext->ConfigurableWebApplicationContex>ApplicationContext->BeanFactory這樣1來spring中的所有bean都由這個類來創建
第3段,講如何部署applicationContext的xml文件。
如果在web.xml中不寫任何參數配置信息,默許的路徑是/WEB-INF/applicationContext.xml,在WEB-INF目錄下創建的xml文件的名稱必須是applicationContext.xml;
如果是要自定義文件名可以在web.xml里加入contextConfigLocation這個context參數:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext-*.xml
</param-value>
</context-param>
在<param-value> </param-value>里指定相應的xml文件名,如果有多個xml文件,可以寫在1起并1“,”號分隔。上面的applicationContext-*.xml采取通配符,比如這那個目錄下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都會1同被載入。
因而可知applicationContext.xml的文件位置就能夠有兩種默許實現:
第1種:直接將之放到/WEB-INF下,之在web.xml中聲明1個listener;
第2種:將之放到classpath下,但是此時要在web.xml中加入<context-param>,用它來指明你的applicationContext.xml的位置以供web容器來加載。依照Struts2 整合spring的官方給出的檔案,寫成:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>
</context-param>
這樣我們看到CGYContextLoaderListener 這個類,我們就知道他肯定也實現了接口servlet api ServletContextListener, 或我們知道它繼承了類spring api ContextLoaderListener
接著往底層看,接口servlet api ServletContextListener 繼承了接口 java.util.EventListener EventListener所有事件偵聽器接口必須擴大的標記接口、
ServletContext : 每個web利用都有1個 ServletContext與之相干聯。 ServletContext對象在利用啟動的被創建,在利用關閉的時候被燒毀。 ServletContext在全局范圍內有效,類似于利用中的1個全局變量。
ServletContextListener: 使用listener接口,開發者能夠在為客戶端要求提供服務之前向ServletContext中添加任意的對象。這個對象在ServletContext啟動的時候被初始化,然后在ServletContext全部運行期間都是可見的。該接口具有兩個方法以下所示:
-
void contextDestoryd(ServletContextEvent sce);
-
-
void contextInitialized(ServletContextEvent sce);
用戶需要創建1個java類實現 javax.servlet.ServletContextListener接口并提供上面兩個方法的實現。
示例: 當你需要在處理任何客戶端要求之前創建1個數據庫連接,并且希望在全部利用進程中該連接都是可用的,這個時候ServletContextListener接口就會10分有用了。
-
package com.database;
-
import javax.servlet.ServletContext;
-
import javax.servlet.ServletContextAttributeEvent;
-
import javax.servlet.ServletContextAttributesListener;
-
import javax.servlet.ServletContextEvent;
-
import javax.servlet.ServletContextListener;
-
import com.database.DbConnection;
-
-
public class DatabaseContextListener implements ServletContextListener {
-
-
private ServletContext context = null;
-
private Connection conn = null;
-
-
public DatabaseContextListener() {
-
-
}
-
-
public void contextInitialized(ServletContextEvent event) {
-
this.context = event.getServletContext();
-
conn = DbConnection.getConnection;
-
-
context = setAttribute(”dbConn”,conn);
-
}
-
-
-
public void contextDestroyed(ServletContextEvent event){
-
this.context = null;
-
this.conn = null;
-
}
-
}
然后部署該類,并在web.xml文件中添加
-
<listener>
-
com.database.DatabaseContextListener
-
</listener>
1旦web利用啟動的時候,我們就可以在任意的servlet或jsp中通過下面的方式獲得數據庫連接:
-
Connection conn = (Connection) getServletContext().getAttribute(”dbConn”);
這里我們就會想到這兩個鬼servletcontext 和 servletcontextlistener 有啥區分
通過上面代碼,我發現似乎好像我們在啟動的時候去初始化接口servletcontextlistener,同時實現servletcontextlistener的兩個方法,在該兩個方法里面我們可以獲得到 servletcontext
既然我們獲得到了servletcontext 。因此WEB容器在啟動時,它會為每一個WEB利用程序都創建1個對應的ServletContext對象,它代表當前web利用。是1個全局的貯存信息的空間servletContext,所有用戶共用1個。所以,為了節省空間,提高效力,ServletContext中,要放必須的、重要的、所有用戶需要同享的線程又是安全的1些信息。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈