Документировано здесь говорится
Этот специальный префикс указывает, что все ресурсы пути к классам, которые соответствуют заданному имени, должны быть получены (внутренне это, по сути, происходит через вызов ClassLoader.getResources (...)), а затем объединены для формирования окончательного определения контекста приложения.
Кто-нибудь может это объяснить?
В чем разница между использованием classpath*:conf/appContext.xml
и classpath:conf/appContext.xml
без звездочки.
Ответы:
ПРОСТОЕ ОПРЕДЕЛЕНИЕ
classpath*:conf/appContext.xml
Просто означает , что все файлы appContext.xml подconf
папкой во всех ваших банках по классам будут собраны и объединены в один большой контекст приложения.Напротив,
classpath:conf/appContext.xml
загрузится только один такой файл ... первый найденный в вашем пути к классам.источник
Этот
classpath*:...
синтаксис полезен в первую очередь, когда вы хотите создать контекст приложения из нескольких файлов определения bean-компонентов, используя синтаксис с подстановочными знаками.Например, если вы создаете свой контекст с помощью
classpath*:appContext.xml
, путь к классам будет сканироваться для каждого ресурса, вызываемогоappContext.xml
в пути к классам, и определения bean-компонентов из всех из них объединены в единый контекст.Напротив,
classpath:conf/appContext.xml
будет получен один и только один файл, вызываемыйappContext.xml
из пути к классам. Если их несколько, остальные игнорируются.источник
classpath *: он ссылается на список ресурсов и загружает все такие файлы, присутствующие в пути к классам, и список может быть пустым, и если такого файла нет в пути к классам, приложение не генерирует никаких исключений (просто игнорирует ошибку).
classpath: он относится к определенному ресурсу и загружает только первый файл, найденный в пути к классам, и если такой файл отсутствует в пути к классам, он вызовет исключение
java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist
источник
Resource
, поскольку ресурс указывает только на один ресурс за раз». плюс я только что получил эту странную ошибку, вот как я оказался здесь. Если вы собираетесь импортировать ресурс, тогда нет смысла использовать префикс пути к классам с подстановочными знаками.Исходный код 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)}; } } }
источник