Как именно работают префиксы, используемые для создания Spring ApplicationContext?

1

Я изучаю сертификацию Spring Core, и у меня есть сомнения относительно того, как правильно объявить новый файл FileSystemXmlApplicationContext в приложении Spring 4.

Я знаю, что в мой метод main() у меня могло бы быть что-то вроде этого:

ApplicationContext context = new FileSystemXmlApplicationContext("classpath:mycompany.mydivision.myapplication.application.config.xml", "file:test-infra-config.xml");

Поэтому, исправьте меня, если я скажу неверное утверждение, эта строка создаст контекст приложения Spring (объект, из которого я получу мой компонент) из двух разных файлов, содержащих определения beans для моего приложения, с именем config.xml и test- infra-config.xml.

Мои сомнения: что именно означает, что первый из них берется из класса, а второй - из файла?

Я думаю, что второй путь относится к рабочему каталогу JVM, а первый - к пути класса приложения (определенному в проекте или что?)

Мои сомнения: весной 4 являются использование classpath: и файла: prefix обязательным?

Из того, что я понял, я могу опустить файл: префикс, но не classpath: prefix (но я не уверен, что это правда в версии Spring 3 или если что-то меняет в версии 4). Если это правда, почему я могу опустить файл: префикс, но не путь к классу: префикс?

Tnx

  • 0
    потому что файл: по умолчанию. Это означает, что если вы не поставите префикс, значением по умолчанию является файл:
Теги:
spring
spring-mvc
applicationcontext

2 ответа

1

Много вопросов:

Я думаю, что второй путь относится к рабочему каталогу JVM и

верный


первый из класса класса приложения (определенный в проекте или что?)

это путь класса, который используется JVM при запуске приложения


Мои сомнения: весной 4 являются использование classpath: и файла: prefix обязательным?

JavaDoc из FileSystemXmlApplicationContext начинается с

Контекст автономного XML-приложения, используя файлы определения контекста из файловой системы или из URL-адресов, интерпретируя простые пути как относительные местоположения файловой системы (например, "mydir/myfile.txt"). Полезно для тестовых жгутов, а также для автономных сред.

ПРИМЕЧАНИЕ. Простые пути всегда будут интерпретироваться как относительные к текущему рабочему каталогу VM, даже если они начинаются с косой черты. (Это согласуется с семантикой в контейнере Servlet.) Используйте явный префикс "файл:", чтобы обеспечить абсолютный путь к файлу.


Из того, что я понял, я могу опустить файл: префикс, но не classpath: prefix (но я не уверен, что это правда в версии Spring 3 или если что-то меняет в версии 4).

правильно (нет изменений между Spring 3 и 4 (см. javadoc))


Если это правда, почему я могу опустить файл: префикс, но не путь к классу: префикс?

Поскольку у вас может быть только одно значение по умолчанию: если вы не указали, ссылается ли путь на файл (систему) или путь к классу, то весна должна решить, где искать файл - и они решили, что они проецируют его как файл (систему) Справка

(Я также могу представить, что это возможно из-за некоторой совместимости истории и обратной совместимости, возможно, первые версии Spring только поддерживали способ файла с любым префиксом в это время - но это догадка без знания)

0

Я думаю, вам стоит взглянуть на документацию по ресурсам, и на многие ваши вопросы ответят.

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

Так, например, если:

ApplicationContext ctx = new ClassPathXmlApplicationContext("my/appCtx.xml");

для загрузки местоположения ресурса будет использоваться ClassPathResource. Он будет рассматривать путь класса JVM classpath вашего приложения.

Альтернативно, если:

ApplicationContext ctx = new FileSystemXmlApplicationContext("my/appCtx.xml");

то файл ctx извлекается из местоположения файловой системы. Если вы не заставите его в строковом расположении с префиксом вместо этого взглянуть на путь к классам:

ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:my/appCtx.xml");

Итак, вернемся к вашему примеру:

ApplicationContext context = new FileSystemXmlApplicationContext("classpath:mycompany.mydivision.myapplication.application.config.xml", "file:test-infra-config.xml");

Таким образом, вы в основном идентифицируете с префиксом непосредственно по строкам локатора метод поиска. Если вы оставите префикс файла из второй строки, это было бы выведено путем реализации вашего контекста приложения.

Итак, чтобы обобщить, не найти префикс перед строками локатора ресурсов, это не означает, что расширенная функция Spring 4 сравнима, скажем, с Spring 3, а скорее использует под сценария Resource на основе реализации вашего контекста приложения.

пс. Что касается весны 3 и 4, то нет никакого расхождения по вышеизложенному.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню