2010-07-20 88 views
117

记录在案here它指出春季类路径前缀区别

此前缀匹配指定的 给定的名称必须获得 所有 的classpath资源(内部,这实际上发生的事情通过中ClassLoader.getResources (。 ..) 调用),然后合并以形成最终应用程序上下文定义 。

有人可以解释这一点吗?

使用classpath*:conf/appContext.xml而不是classpath:conf/appContext.xml没有星号有什么区别。

回答

168

简单的定义

classpath*:conf/appContext.xml只是意味着所有appContext.xml文件中所有的罐子在classpath将有所回升,并加入到一个大的应用程序上下文conf文件夹。

相比之下,classpath:conf/appContext.xml将加载只有一个这样的文件 ...第一个找到你的类路径。

+6

他们之间还有一个更有趣的区别。请参阅我的问题:http:// stackoverflow。com/questions/16985770/runwith-and-contextconfiguration-weird-behavior – Eugene 2013-06-08 18:48:12

+17

一个非常重要的事情 - 如果你使用*和Spring发现没有匹配,它不会抱怨。如果你不使用*并且没有匹配,则上下文不会启动(!) – 2014-04-04 19:32:40

37

classpath*:...语法主要用于当您要使用通配符语法从多个bean定义文件构建应用程序上下文时。例如,如果使用classpath*:appContext.xml构造您的上下文,则将在类路径中扫描类路径中每个称为appContext.xml的资源,并将它们中的所有bean定义合并到一个上下文中。

与此相反,classpath:conf/appContext.xml将从类路径中获取一个且唯一一个名为appContext.xml的文件。如果有多个,其他人将被忽略。

+1

classpath *会在子目录中查找吗?换句话说,如果我在classpath根目录中有appContext.xml,而在/dir/appContext.xml中有一个appContext.xml,那么当我使用classpath *:appContext.xml时,它会同时加载吗? – AHungerArtist 2015-09-22 17:17:56

17

的classpath *:它是指资源和负荷的列表出现在类路径和列表中的所有这样的文件可能是空的如果没有这样的文件在类路径中,然后应用目前不会抛出任何异常(只是忽略错误)。

类路径:它是指一个一定的资源负荷只有第一在classpath和找到的文件,如果没有这样的文件存在于classpath中会抛出异常

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist