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