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