摘要:額外知識點參考知識點加載策略資源后,容器啟動時會調用的方法。從獲取對象對象,如果存在則拋異常。這個是重點核心的知識點,參考知識點。看到這里應該知道每一層的作用吧,一層一層往上遞進第四步正在研讀
1.根據我們常用的web.xml里,我們找到的org.springframework.web.context.ContextLoaderListener。web.xml如下
moon org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath*:applicationContext.xml
其實ContextLoaderListener是一個ServletContextListener,一個web容器的監聽器。根據其父類org.springframework.web.context.ContextLoader初始化的策略配置,找到類目錄下面的ContextLoader.properties文件。里面配置著一個Spring上下文類。
# Default WebApplicationContext implementation class for ContextLoader. # Used as fallback when no explicit context implementation has been specified as context-param. # Not meant to be customized by application developers. org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
額外知識點:
參考《ClassPathResource知識點》
加載策略資源(ContextLoader.properties)后,web容器啟動時會調用ContextLoaderListener的contextInitialized方法。
contextInitialized方法里初始化ContextLoader.properties配置的org.springframework.web.context.support.XmlWebApplicationContext,這個初始化過程有點長。
4.1 從ServletContext獲取對象springcontext對象,如果存在則拋異常。key=org.springframework.web.context.WebApplicationContext.ROOT
4.2 從ContextLoader.properties獲取className=org.springframework.web.context.support.XmlWebApplicationContext
4.3 通過ClassUtils工具實例化spring的ApplicationContext,我們能夠看出他是使用ContextLoader類的類加載器,這里有個可以弄個知識點《ClassUtils知識點》
ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader())
4.4 XmlWebApplicationContext實例化時,其一些列父類也將初始化和實例化(我稍微地簡化說,具體的可以看源碼):
層次 | 類名 | 作用 |
---|---|---|
第0層 | org.springframework.web.context.support.XmlWebApplicationContext | 定義默認配置文件,如/WEB-INF/applicationContext.xml |
第1層 | org.springframework.web.context.support.AbstractRefreshableWebApplicationContext | 聲明了ServletContext servletContext和ServletConfig servletConfig |
第2層 | org.springframework.context.support.AbstractRefreshableConfigApplicationContext | 此時就跟web沒多大關系了,定義了配置變量String[] configLocations |
第3層 | org.springframework.context.support.AbstractRefreshableApplicationContext | 此層就重要了,定義了DefaultListableBeanFactory beanFactory |
第4層 | org.springframework.context.support.AbstractApplicationContext | 此層定義了父context,還有ApplicationContext的其他配置等,refresh()方法 |
第5層 | org.springframework.core.io.DefaultResourceLoader | 此層與ApplicationContext沒多大關系,從包名也能看出,聲明了ClassLoader |
第6層(最后一層) | org.springframework.core.io.ResourceLoader | spring的作者的注釋是Strategy interface for loading resources,嗯哈,大概猜是使用策略模式的接口 |
實例化完XmlWebApplicationContext類后,就開始做點事情了。在ContextLoader里,有個方法configureAndRefreshWebApplicationContext(cwac, servletContext),從方法名就能看出是配置和刷新ApplicationContext。
5.1 設置ServletContext,參考第1層
5.2 設置configLocations,參考第2層,這里又一個知識點《StringUtils知識點》
5.3 調用AbstractRefreshableWebApplicationContext的createEnvironment()方法來初始化StandardServletEnvironment對象。參考知識點《StandardServletEnvironment知識點》
5.4 調用StandardServletEnvironment對象initPropertySources(ServletContext servletContext, ServletConfig servletConfig)方法來獲取web容器所有配置信息。配置信息都在放在StandardServletEnvironment對象的MutablePropertySources對象里。
5.5 customizeContext(sc, wac)自定義初始化applicationContext的一些信息,里面是獲取實現org.springframework.context.ApplicationContextInitializer接口的一些方法調用。一個知識點也誕生《ApplicationContextInitializer知識點》
5.6 重頭戲來了,refresh ApplicationContext!!!,調用第4層的refresh()方法。
5.6.1 第一步:加載ServletContext和ServletConfig參數,并使用PropertySourcesPropertyResolver校驗是否有必須的配置缺失,可參考知識點《PropertySourcesPropertyResolver知識點》。 5.6.2 第二步:實例化BeanFactory,交給子類AbstractRefreshableApplicationContext來實例化(參考第3層),實例化了org.springframework.beans.factory.support.DefaultListableBeanFactory對象作為變量beanFactory的值。并配置是否允許覆蓋bean和是否允許循環引用,默認都是否。 5.6.3 第三步:第3層AbstractRefreshableApplicationContext去loadBeanDefinitions,loadBeanDefinitions方法被子類XmlWebApplicationContext覆寫了,創建org.springframework.beans.factory.xml.XmlBeanDefinitionReader對象進行加載Bean的定義。這個是重點核心的知識點,參考《XmlBeanDefinitionReader知識點》。 看到這里應該知道每一層ApplicationContext的作用吧,一層一層往上遞進 5.6.4 第四步: //TODO 正在研讀XmlBeanDefinitionReader
//TODO
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67936.html
摘要:接口類三個具有代表性的實現類通過的和,我們找到利用去解析路徑配置文件的路徑。上面可能講的有點繞,但卻是入口之一。根據路徑的特性,分別封裝為或對象。另外用包里的做了實驗,發現可以讀到包里的信息。則是包的根地方,如,用于公共配置文件。 接口類:org.springframework.core.io.Resource 三個具有代表性的實現類: org.springframework.we...
摘要:在實戰一書中前面兩部分分別介紹了和的高級特性,并且基于類配置有一套層的,但是沒有將層整合層,于是我試著整合了下,也方便以后寫測試。 在《springBoot實戰》 一書中前面兩部分分別介紹了spring 和 springMVC的高級特性,并且基于java類配置有一套web層的demo,但是沒有將web層整合dao層,于是我試著整合了下,也方便以后寫測試demo。下面是我的整理 pom....
摘要:一首先從網上下載代碼導入公鑰并驗證源碼簽名,命令如下二對代碼進行安裝,命令如下三安裝完畢之后,我們可以在終端中輸入如下命令來查看幫助的信息如下運行運行守護程序使用一個未使用過的地址創建一個付款請求 一、首先從網上下載代碼、導入gpg公鑰并驗證源碼簽名,命令如下: wget https://raw.githubusercontent... gpg --import ThomasV.a...
摘要:介紹什么是在軟件業,為的縮寫,意為面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。切面是切入點和通知引介的結合。切面類權限校驗。。。 1. AOP 1.1 AOP介紹 1.1.1 什么是AOP 在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術...
閱讀 2100·2023-04-25 17:23
閱讀 2919·2021-11-17 09:33
閱讀 2512·2021-08-21 14:09
閱讀 3578·2019-08-30 15:56
閱讀 2604·2019-08-30 15:54
閱讀 1622·2019-08-30 15:53
閱讀 2125·2019-08-29 13:53
閱讀 1140·2019-08-29 12:31