摘要:接口類三個具有代表性的實現類通過的和,我們找到利用去解析路徑配置文件的路徑。上面可能講的有點繞,但卻是入口之一。根據路徑的特性,分別封裝為或對象。另外用包里的做了實驗,發現可以讀到包里的信息。則是包的根地方,如,用于公共配置文件。
接口類:org.springframework.core.io.Resource
三個具有代表性的實現類:
org.springframework.web.context.support.ServletContextResource
org.springframework.core.io.ClassPathResource
org.springframework.core.io.UrlResource
通過XmlWebApplicationContext的loadBeanDefinitions(DefaultListableBeanFactory beanFactory)和loadBeanDefinitions(XmlBeanDefinitionReader reader),我們找到ApplicationContext利用ServletContextResourcePatternResolver去解析路徑(配置文件的路徑)。
上面可能講的有點繞,但卻是入口之一。 我們可以跳出這個細節來看,其實Resource是通過ResourceLoader去加載(名字也能看出啦),而ApplicationContex是ResourceLoader的一個實現。所以Application有getResource()的方法,但具體實例化Resource,ApplicationContex不親自干,而是用組合的形式交給ResourcePatternResolver去處理,這是因為不同環境尋找配置文件的形式不一樣,而其中PathMatchingResourcePatternResolver和ServletContextResourcePatternResolver是ResourcePatternResolver的實現,用于不同環境中加載Resource。
ServletContextResourcePatternResolver會將路徑封裝成Resource對象。根據路徑的特性,分別封裝為ServletContextResource、ClassPathResource或UrlResource對象。
這里個路徑清理的工具類StringUtils.cleanPath,參考《StringUtils知識點》
我們先看一些默認路徑的知識:
package org.springframework.jc; import org.apache.commons.logging.Log; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.Properties; public class ClassGetResourceTest { public static void main(String[] args) throws IOException { System.out.println("============================================env==================================="); Mapmap = System.getenv(); for (Iterator itr = map.keySet().iterator(); itr.hasNext(); ) { String key = itr.next(); System.out.println(key + "=" + map.get(key)); } System.out.println("============================================properties==================================="); Properties properties = System.getProperties(); for(String key:properties.stringPropertyNames()){ System.out.println(key + "=" + properties.get(key)); // user.dir=/home/cherry/git/spring-framework } System.out.println(ClassGetResourceTest.class.getResource("")); //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/org/springframework/jc/ System.out.println(ClassGetResourceTest.class.getResource("/")); //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/ //喲喲,不同包下的類,Log.class.getResource("")是不一樣的!!! 可以獲取jar包里的配置文件哦,如commons-logging-1.2.jar包 System.out.println(Log.class.getResource("")); //jar:file:/home/cherry/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar!/org/apache/commons/logging/ System.out.println(Log.class.getResource("/")); //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/ File file = new File("test.txt"); file.createNewFile(); System.out.println(file.getAbsolutePath()); //使用user.dir作為根目錄 System.out.println(ClassGetResourceTest.class.getName() + ".ROOT"); System.out.println(ClassGetResourceTest.class.getClassLoader()); //sun.misc.Launcher$AppClassLoader@18b4aac2 System.out.println(ClassGetResourceTest.class.getClassLoader().getResource("")); //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/ //作用和ClassGetResourceTest.class.getResource("/")一樣 System.out.println(ClassGetResourceTest.class.getClassLoader().getResource("/")); //null //ClassLoader.getResource不可以使用"/" //不同包下的類,結果也與ClassGetResourceTest.class.getClassLoader()一樣,于是不可以獲取jar包里的配置文件哦,如commons-logging-1.2.jar包 System.out.println(Log.class.getClassLoader()); //sun.misc.Launcher$AppClassLoader@18b4aac2 System.out.println(Log.class.getClassLoader().getResource("")); //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/ //作用和ClassGetResourceTest.class.getResource("/")一樣 System.out.println(Log.class.getClassLoader().getResource("/")); //null //ClassLoader.getResource不可以使用"/" } }
從上可以得出一些結論:
user.dir是jvm的系統屬性,默認是取你執行命令時的目錄,也就是說如果在/mydata使用命令 /mydata/jc-test/server.sh start,此時user.dir為/mydata,如果在/mydata/other目錄執行/mydata/jc-test/server.sh start,則此時user.dir為/mydata/other
class.getResource方法,根據是否以根目錄“/”開始來決定文件目錄:
class.getResource("")相對于當前類的目錄,是個相對路徑。例如一些不是公共的配置文件,僅僅這個類或這個包下使用的配置文件。 另外用jar包里的class做了實驗,發現可以讀到jar包里的信息。
class.getResource("/")則是包的根地方,如..../classes/,用于公共配置文件。
ClassLoader.getResource方法,不可以根目錄“/”開始來決定文件目錄,否則為null:
ClassLoader.getResource("")則是包的根地方,如..../classes/
ClassLoader.getResource("")為null
好了,我們現在回歸主題,org.springframework.core.io.ClassPathResource能夠根據類或加載器(classload)來加載類路徑的文件,原文:
Resource implementation for class path resources. Uses either a given ClassLoader or a given Class for loading resources.
核心邏輯:
/** * This implementation opens an InputStream for the given class path resource. * @see java.lang.ClassLoader#getResourceAsStream(String) * @see java.lang.Class#getResourceAsStream(String) */ @Override public InputStream getInputStream() throws IOException { InputStream is; if (this.clazz != null) { is = this.clazz.getResourceAsStream(this.path); } else if (this.classLoader != null) { is = this.classLoader.getResourceAsStream(this.path); } else { is = ClassLoader.getSystemResourceAsStream(this.path); } if (is == null) { throw new FileNotFoundException(getDescription() + " cannot be opened because it does not exist"); } return is; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67937.html
摘要:介紹什么是在軟件業,為的縮寫,意為面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。切面是切入點和通知引介的結合。切面類權限校驗。。。 1. AOP 1.1 AOP介紹 1.1.1 什么是AOP 在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術...
摘要:額外知識點參考知識點加載策略資源后,容器啟動時會調用的方法。從獲取對象對象,如果存在則拋異常。這個是重點核心的知識點,參考知識點。看到這里應該知道每一層的作用吧,一層一層往上遞進第四步正在研讀 1.根據我們常用的web.xml里,我們找到的org.springframework.web.context.ContextLoaderListener。web.xml如下 moo...
摘要:后置增強周杰倫環繞通知在切面類中添加以下方法環繞通知環繞前增強環繞前增強測試前置增強保存訂單。。。不使用事務管理。 1. Spring基于AspectJ的注解的AOP開發 1. 1 SpringAOP的注解入門 創建項目,導入jar包 需要導入Spring基礎包4+2 需要導入AOP聯盟包、AspectJ包、Spring整合Aspect包Spring-aop包 Spring整合單...
摘要:在實戰一書中前面兩部分分別介紹了和的高級特性,并且基于類配置有一套層的,但是沒有將層整合層,于是我試著整合了下,也方便以后寫測試。 在《springBoot實戰》 一書中前面兩部分分別介紹了spring 和 springMVC的高級特性,并且基于java類配置有一套web層的demo,但是沒有將web層整合dao層,于是我試著整合了下,也方便以后寫測試demo。下面是我的整理 pom....
摘要:甲乙交易活動不需要雙方見面,避免了雙方的互不信任造成交易失敗的問題。這就是的核心思想。統一配置,便于修改。帶參數的構造函數創建對象首先,就要提供帶參數的構造函數接下來,關鍵是怎么配置文件了。 前言 前面已經學習了Struts2和Hibernate框架了。接下來學習的是Spring框架...本博文主要是引入Spring框架... Spring介紹 Spring誕生: 創建Spring的...
閱讀 1516·2021-08-09 13:47
閱讀 2776·2019-08-30 15:55
閱讀 3500·2019-08-29 15:42
閱讀 1122·2019-08-29 13:45
閱讀 3015·2019-08-29 12:33
閱讀 1748·2019-08-26 11:58
閱讀 991·2019-08-26 10:19
閱讀 2416·2019-08-23 18:00