spring 路径配置通配符是如何实现的

在spring的配置文件中、经常看见类似这样的配置路径: classpath:/com/module/**/*sql.xml 

系统会根据配置路径自动加载符合路径规则的xml文件。

Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源。

Ant路径通配符支持“?”、“*”、“**”,注意通配符匹配不包括目录分隔符“/”:
 
“?”:匹配一个字符,如“config?.xml”将匹配“config1.xml”;
“*”:匹配零个或多个字符串,如“cn/*/config.xml”将匹配“cn/javass/config.xml”,但不匹配匹配“cn/config.xml”;而“cn/config-*.xml”将匹配“cn/config-dao.xml”;
“**”:匹配路径中的零个或多个目录,如“cn/**/config.xml”将匹配“cn /config.xml”,也匹配“cn/javass/spring/config.xml”;而“cn/javass/config-**.xml”将匹配“cn/javass/config-dao.xml”,即把“**”当做两个“*”处理。

[java] view plain copy
 
  1. ResourcePatternResolver resourceLoader = new PathMatchingResourcePatternResolver();  
  2. Resource[] source = resourceLoader.getResources(filePath);  
  3.   
  4. for (int i = 0; i < source.length; i++) {  
  5.     Resource resource = source[i];  
  6.     System.out.println(resource.getFilename());  
  7. }  


Spring在加载类路径资源时除了提供前缀“classpath:”的来支持加载一个Resource,还提供一个前缀“classpath*:”来支持加载所有匹配的类路径Resource。
 
Spring提供ResourcePatternResolver接口来加载多个Resource,该接口继承了ResourceLoader并添加了“Resource[] getResources(String locationPattern)”用来加载多个Resource:

[java] view plain copy
 
  1. public interface ResourcePatternResolver extends ResourceLoader {    
  2.        String CLASSPATH_ALL_URL_PREFIX = "classpath*:";    
  3.        Resource[] getResources(String locationPattern) throws IOException;    
  4. }  

  Spring提供了一个ResourcePatternResolver实现PathMatchingResourcePatternResolver,它是基于模式匹配的,默认使用AntPathMatcher进行路径匹配,它除了支持ResourceLoader支持的前缀外,还额外支持“classpath*:”用于加载所有匹配的类路径Resource,ResourceLoader不支持前缀“classpath*:”

一:“classpath”: 用于加载类路径(包括jar包)中的一个且仅一个资源;对于多个匹配的也只返回一个,所以如果需要多个匹配的请考虑“classpath*:”前缀;

二:“classpath*”: 用于加载类路径(包括jar包)中的所有匹配的资源。带通配符的classpath使用“ClassLoader”的“Enumeration<URL> getResources(String name)”方法来查找通配符之前的资源,然后通过模式匹配来获取匹配的资源。如“classpath:META-INF/*.INF”将首先加载通配符之前的目录“META-INF”,然后再遍历路径进行子路径匹配从而获取匹配的资源。

三:“file”:加载一个或多个文件系统中的Resource。如“file:D:/*.txt”将返回D盘下的所有txt文件;

四:无前缀:通过ResourceLoader实现加载一个资源。 
AppliacationContext提供的getResources方法将获取资源委托给ResourcePatternResolver实现,默认使用PathMatchingResourcePatternResolver。

原文地址:https://www.cnblogs.com/zhoading/p/8037779.html