Spring可以通過指定classpath*:與classpath:前綴加路徑的方式從classpath加載文件,如bean的定義文件.classpath*:的出現(xiàn)是為了從多個jar文件中加載相同的文件.classpath:只能加載找到的第一個文件.
比如 resource1.jar中的package 'com.test.rs' 有一個 'jarAppcontext.xml' 文件,內容如下:
<bean name="ProcessorImplA" class="com.test.spring.di.ProcessorImplA" />
resource2.jar中的package 'com.test.rs' 也有一個 'jarAppcontext.xml' 文件,內容如下:
<bean id="ProcessorImplB" class="com.test.spring.di.ProcessorImplB" />
通過使用下面的代碼則可以將兩個jar包中的文件都加載進來
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"classpath*:com/test/rs/jarAppcontext.xml");
而如果寫成下面的代碼,就只能找到其中的一個xml文件(順序取決于jar包的加載順序)
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"classpath:com/test/rs/jarAppcontext.xml");
classpath*:的使用是為了多個component(最終發(fā)布成不同的jar包)并行開發(fā),各自的bean定義文件按照一定的規(guī)則:package+filename,而使用這些component的調用者可以把這些文件都加載進來.
classpath*:的加載使用了classloader的 getResources()
方法,如果是在不同的J2EE服務器上運行,由于應用服務器提供自己的classloader實現(xiàn),它們在處理jar文件時的行為也許會有所不同。 要測試 classpath*:
是否有效,可以用classloader從classpath中的jar文件里加載文件來進行測試: getClass().getClassLoader().getResources("<someFileInsideTheJar>")
。(上面的例子是在sun的jre中運行的狀態(tài))
來自:http://blog.csdn.net/kkdelta/article/details/5507799