1. 程式人生 > >IDEA 中讀取不了配置檔案以及ClassPathXmlApplicationContext與FileSystemXmlApplicationContext

IDEA 中讀取不了配置檔案以及ClassPathXmlApplicationContext與FileSystemXmlApplicationContext

在學習Spring的時候(看的《Spring4.x企業應用開發實戰》),書上用的IDE 是 Myeclipse,這裡用的是IDEA。在編譯:

String configPath = "com/baobaotao/advice/beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);

提示錯誤

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com
/baobaotao/advice/beans.xml]; nested exception is java.io.FileNotFoundException: class path resource [com/baobaotao/advice/beans.xml] cannot be opened because it does not exist at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344) at org.springframework
.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader
.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:515) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.baobaotao.advice.TestThrowAdvice.main(TestThrowAdvice.java:14) Caused by: java.io.FileNotFoundException: class path resource [src/main/java/com/baobaotao/advice/beans.xml] cannot be opened because it does not exist at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330) ... 13 more

異常說的比較清楚,指定路徑的檔案不存在。怎麼可能不存在呢,這裡用File的輸出流測試,列印到控制檯上沒有問題,說明路徑是沒有問題的。
然後修改成了

String configPath = "src/main/java/com/baobaotao/advice/beans.xml";
ApplicationContext ctx = new FileSystemXmlApplicationContext(configPath);

是可以訪問到的。

ClassPathXmlApplicationContext

ClassPathXmlApplicationContext 預設從類路徑載入配置檔案,在類路徑資料夾下。這裡用的maven的資料夾結構,如下圖:
這裡寫圖片描述
  target資料夾就是存放class類的資料夾問價相應目錄下,並沒有beans.xml檔案。IDEA在原始碼目錄下(src/main/java),只會把.java檔案編譯成.class檔案,存到classes資料夾下,其他的配置檔案是不會做處理的(MyEclipse會把配置檔案複製到相應的包下)。但可以在resources資料夾下,建立相應的包目錄,放到相應的目錄下,IDEA就會將配置檔案,複製到classes資料夾下,也就可以訪問到了。
  這裡從類路徑載入檔案只需要寫指定的包路徑以及檔名即可。如:

String configPath = "com/baobaotao/advice/beans.xml";

FileSystemXmlApplicationContext

FileSystemXmlApplicationContext 預設從檔案系統載入配置檔案,可使用相對路徑或者絕對路徑進行訪問,也就理所當然的會訪問到相應的檔案。這裡從檔案系統訪問路徑需要從根路徑開始寫完整檔案相對路徑,也就是從src開始寫,如:

String configPath = "src/main/java/com/baobaotao/advice/beans.xml";