一般Java配置和Spring配置文件的加載路徑

之前做.NET的時候,讀取自定義的配置文件都是習慣於用絕對路徑的方式,感覺很方便,也沒那麼多困惑。

剛剛Spring入門的時候,看很多網上的教程都是配置文件放在src根目錄下,然後從claspath去讀取。然而這樣我心裡總像有個疙瘩似得,如果有很多配置文件一眼看去一大坨,很不爽,在這一點上感覺好像有強迫症了啊。

一般Java配置和Spring配置文件的加載路徑

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文件中創建監聽器:

org.springframework.web.context.ContextLoaderListener

配置配置文件路徑

contextConfigLocation

/WEB-INF/config/appContext.xml

ContextLoaderListener的作用就是啟動Web容器時,自動裝配ApplicationContext的配置信息。因為它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啟動容器時,就會默認執行它實現的方法。

如果在web.xml中不寫任何參數配置信息,默認的路徑是"/WEB-INF/applicationContext.xml, 在WEB-INF目錄下創建的xml文件的名稱必須是applicationContext.xml。

如果是要自定義文件名可以在web.xml里加入contextConfigLocation這個context參數: 在 裡指定相應的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)一樣的結果

嗯。這樣在我心裡就有點清楚了。不知各位大俠有更好更合適的方式嗎?不妨分享出來讓大家見識見識啊?


分享到:


相關文章: