Разница префикса пути к классу Spring - PullRequest
133 голосов
/ 21 июля 2010

Документировано здесь здесь указано

Этот специальный префикс указывает, что все ресурсы пути к классам, соответствующие данному имени, должны быть получены (внутренне это по сути происходит через ClassLoader.getResources (...) вызывается), а затем объединяется для формирования окончательного определения контекста приложения.

Может кто-нибудь объяснить это?

В чем разница между использованием classpath*:conf/appContext.xml и classpath:conf/appContext.xml без звездочки.

Ответы [ 4 ]

196 голосов
/ 21 июля 2010

ПРОСТОЕ ОПРЕДЕЛЕНИЕ

classpath*:conf/appContext.xml просто означает, что все файлы appContext.xml в conf папках во всех ваших банках на пути к классам будут выбраныи объединены в один большой контекст приложения.

Напротив, classpath:conf/appContext.xml загрузит только один такой файл ... первый найденный на вашем пути к классам.

38 голосов
/ 21 июля 2010

Синтаксис classpath*:... полезен, прежде всего, когда вы хотите построить контекст приложения из нескольких файлов определений бина, используя синтаксис с подстановочными знаками.

Например, если вы создаете свой контекст с использованием classpath*:appContext.xml, classpathбудет сканироваться для каждого ресурса с именем appContext.xml в пути к классам, и определения компонентов всех их объединяются в один контекст.

В отличие от этого, classpath:conf/appContext.xml получит один и только один файл с именем appContext.xml из пути к классам.Если их больше одного, остальные будут игнорироваться.

21 голосов
/ 19 марта 2015

classpath *: Это относится к списку ресурсов и загружает все такие файлы, присутствующие в classpath и список может быть пустым и если такого файла нет в пути к классам, то приложение не выдает никаких исключений (просто игнорирует ошибку).

путь к классам: Это относится к определенному ресурсу и загружает только первый файл, найденный в пути к классам, и , если такого файла нет в пути к классам, он выдаст исключение

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist
0 голосов
/ 20 марта 2019

Исходный код Spring:

public Resource[] getResources(String locationPattern) throws IOException {
   Assert.notNull(locationPattern, "Location pattern must not be null");
   //CLASSPATH_ALL_URL_PREFIX="classpath*:"
   if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
      // a class path resource (multiple resources for same name possible)
      if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
         // a class path resource pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // all class path resources with the given name
         return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
      }
   }
   else {
      // Only look for a pattern after a prefix here
      // (to not get fooled by a pattern symbol in a strange prefix).
      int prefixEnd = locationPattern.indexOf(":") + 1;
      if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
         // a file pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // a single resource with the given name
         return new Resource[] {getResourceLoader().getResource(locationPattern)};
      }
   }
}  
...