在 exlipse 使用 Spring 讀取 ApplicationContext 的路徑問題

Spring 讀取 xml 檔的路徑問題困擾了我很久

測試讀取成功後稍微整理了一下幾個讀取方法

Spring 讀取 ApplicationContext 用甚麼方式?

可以選擇 FileSystemXmlApplicationContext 或是 ClassPathXmlApplicationContext

先介紹我個人認為最簡單的讀取方式...

 

1.使用 file: 

    用下面兩種方式都可以讀取的到

ApplicationContext factory
=new ClassPathXmlApplicationContext("file:檔案在硬碟的絕對路徑"); 

ApplicationContext factory
=new FileSystemXmlApplicationContext("file:檔案在硬碟的絕對路徑"); 

   那絕對路徑從哪找?

   用 eclipse 的話直接左鍵點擊你要找的那個檔案

    右鍵選 properties 或是直接 Alt + Enter 可看到如下圖

紅字畫起來的就是我們要的

 

2.使用 classpath:

   用 classpath 前綴詞的狀況是要讀取的 xml 檔案放在 eclipse 中 src 底下

   先不談 eclipse, 電腦要執行 java 的 class 檔案是從 classpath 下去找的

   此時我踩到的雷是, 我直接將 src (上面圖紅線處 ) 當作 classpath 下去找

   執行後的 output 都是..

Caused by: java.io.FileNotFoundException: class path resource [ 這裡是你在建立實體物件時放的path ] 
cannot be opened because it does not exist

 

  src folder 裡面是放還沒編譯過的 java 檔案

  執行時當然不會從 src folder 下去找,

  確認下

  windows->Preferences-> Java -> Build Path 

  看到

   bin 目錄是 編譯完 class 檔案 output 去的地方, 它的位置就在你的專案資料夾底下

   本來我的 code 是寫成

ApplicationContext factory
=new ClassPathXmlApplicationContext("classpath:sC/core/test/sC/core/com/ccc/ggg/cr/hp/applicationContext-myTest-gg.xml"); 

這個路徑去找實際的 src資料夾 底下找也可以找到 xml 檔案,

但 ClassPathXmlApplication 實際上不是從 src 下去讀的

從 bin資料夾 下去找, xml 檔其實在

test/sC/core/com/ccc/ggg/cr/hp/applicationContext-myTest-gg.xml

先不管為何編譯完會放在這 (前面的 sC/core/ 消失了 )

總之 xml 檔案放在 src 底下, 那要讀取就先從 bin 資料夾找到你的 xml 檔案, 並拿 bin 底下指到 xml 檔案放置的位置路徑讀取

code:

ApplicationContext factory
=new ClassPathXmlApplicationContext("classpath:bin底下指向xml檔案的path, 多少會跟src中指向xml檔案的path雷同"); 
ApplicationContext factory
=new FileSystemXmlApplicationContext(classpath:bin底下指向xml檔案的path, 多少會跟src中指向xml檔案的path雷同"); 

 

3.不加上 file: , classpath: , 直接填入 path

ApplicationContext factory
=new FileSystemXmlApplicationContext("從eclipse中的專案資料夾下去找"); 

 "eclipse中的專案資料夾"就是..

右鍵你的專案名稱, 以下面圖的例子來說就是 TestJava

Location 就是 eclipse 中你的專案資料夾, 預設就是從這裡讀取的

假設一個aaa.xml 放在 E:\fromUSB\TestJava 底下

那就直接

ApplicationContext factory
=new FileSystemXmlApplicationContext("aaa.xml"); 

就可以讀取到了

 

至於ClassPathXmlApplicationContext 呢?

預設就是 classpath: 了, 以第二項的例子來說

ApplicationContext factory
=new ClassPathXmlApplicationContext("sC/core/test/sC/core/com/ccc/ggg/cr/hp/applicationContext-myTest-gg.xml"); 

只是把 classpath: 拿掉, 效果也相同

 

P.S 

看完上面一定會有疑問,

eclipse 編譯完後輸出的 class 檔案放置的路徑怎麼跟在 src 裡面不一樣 ?

FileSystemXmlApplication 是從專案資料夾開始找檔案, 那 Spring 是怎麼定位到 "專案資料夾" ?

總之是會用了, 有空再研究這些議題...

 

參考資料:

http://blog.sina.com.cn/s/blog_5d9101fd0100cjhz.html

https://blog.csdn.net/iaiti/article/details/52593150

https://caterpillar.gitbooks.io/javase6tutorial/content/c2_2.html