Spring學習總結(24)——Spring配置檔案載入路徑總結

一杯甜酒發表於2017-11-26
1. Spring使用ClassPathXmlApplicationContext 從classpath讀取
ClassPathXmlApplicationContext 預設會去 classPath 路徑下找。classPath 路徑指的就是編譯後的 classes 目錄。
1.1 如果配置檔案在classpath目錄下:
ClassPathXmlApplicationContext tx = new ClassPathXmlApplicationContext("appContext2.xml");
1.2 如果一個包專門用來存配置檔案
ClassPathXmlApplicationContext tx = new ClassPathXmlApplicationContext("//my/config/appContext2.xml");
或者
ClassPathXmlApplicationContext tx = new ClassPathXmlApplicationContext("my/config/appContext2.xml");
其實這兩種都是相對於classpath路徑的路徑
1.3 也可以絕對路徑獲取,但是路徑前要加“file”
BeanFactory beanFactory = new ClassPathXmlApplicationContext("file:E:projectsrcmainesourcesapplicationContext.xml");
2. Spring使用FileSystemXmlApplicationContext載入
FileSystemXmlApplicationContext 預設是去專案的路徑下載入,可以是相對路徑,也可以是絕對路徑,若是絕對路徑,“file:” 字首可以預設。
2.1 使用FileSystemXmlApplicationContext也可以從classpath載入,要在路徑前新增classpath字首
FileSystemXmlApplicationContext tx = new FileSystemXmlApplicationContext("classpath:my/config/appContext2.xml");
2.2 以絕對路徑形式載入
FileSystemXmlApplicationContext tx = new FileSystemXmlApplicationContext("d:/my/config/appContext2.xml");
當然 這裡比較好的做法是程式執行期間動態的算出絕對路徑,避免直接在程式碼裡寫死一個絕對路徑。
3. SpringMvc使用WebApplicationContext
在Web專案中,可以使用ContextLoaderListener 自動裝配ApplicationContext的資訊。
在web.xml檔案中建立監聽器:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置配置檔案路徑
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/appContext.xml</param-value>
</context-param>
ContextLoaderListener的作用就是啟動Web容器時,自動裝配ApplicationContext的配置資訊。因為它實現了ServletContextListener這個介面,在web.xml配置這個監聽器,啟動容器時,就會預設執行它實現的方法。
如果在web.xml中不寫任何引數配置資訊,預設的路徑是"/WEB-INF/applicationContext.xml, 在WEB-INF目錄下建立的xml檔案的名稱必須是applicationContext.xml。
如果是要自定義檔名可以在web.xml里加入contextConfigLocation這個context引數: 在<param-value> </param-value>裡指定相應的xml檔名,如果有多個xml檔案,可以寫在一起並以“,”號分隔。
也可以這樣applicationContext-*.xml採用萬用字元,比如這那個目錄下有applicationContext-ibatis-base.xml,
applicationContext-action.xml,applicationContext-ibatis-dao.xml等檔案,都會一同被載入。
4. Java中的路徑讀取
封裝一個方法獲取classpath絕對路徑:
public static String getRealPath(String file) {
String path = PathUtils.class.getClassLoader().getResource(file).getPath();
return path;
}
class.getResource("")要想獲得檔案的路徑,得從最終生成的.class檔案為著手點,再結合相對路徑的概念,就可以準確地定位資原始檔了。不同的IDEbuild出來是不同的位置下的,不過都是以頂層package作為根目錄,比如在Web應用中,有一個WEB-INF的目錄,WEB-INF目錄裡面除了web.xml檔案外,還有一個classes目錄,它就是這個WEB應用的package的頂層目錄,也是所有.class的根目錄“/”,假如clasaes目錄下面有一個mynewfile.txt檔案,它的相對路徑就是"/mynewfile.txt",如果相對路徑不是以"/"開頭,那麼它就是相對於.class的路徑。
class.getClassLoader().getResource 如果是getClassLoader().getResource,路徑前加不加"/"都是可以的,比如Home.class.getClassLoader().getResource("my/config/file1.html")和Home.class.getClassLoader().getResource("/my/config/file1.html")都是可以的。
還有一個getResourceAsStream()方法,引數是與getResouce()方法是一樣的,它相當於你用getResource()取得File檔案後,再new InputStream(file)一樣的結果

相關文章