Spring Resource: предостережения относительно FileSystemResource
FileSystemResource, который не присоединен к FileSystemApplicationContext (то есть, когда FileSystemApplicationContext не является фактическим ResourceLoader), обрабатывает абсолютные и относительные пути, как и следовало ожидать. Относительные пути указываются относительно текущего рабочего каталога, а абсолютные пути - относительно корня файловой системы.
Однако по причинам обратной совместимости (историческим) это изменяется, когда FileSystemApplicationContext является ResourceLoader. FileSystemApplicationContext заставляет все присоединенные экземпляры FileSystemResource рассматривать все пути к расположению как относительные, независимо от того, начинаются они с косой черты или нет. На практике это означает, что следующие примеры эквивалентны:
Java
ApplicationContext ctx =
new FileSystemXmlApplicationContext("conf/context.xml");
ApplicationContext ctx =
new FileSystemXmlApplicationContext("/conf/context.xml");
Kotlin
val ctx = FileSystemXmlApplicationContext("conf/context.xml")
val ctx = FileSystemXmlApplicationContext("/conf/context.xml")
Следующие примеры также эквивалентны (хотя имело бы смысл их различать, поскольку один случай относительный, а другой абсолютный):
Java
FileSystemXmlApplicationContext ctx = ...;
ctx.getResource("some/resource/path/myTemplate.txt");
FileSystemXmlApplicationContext ctx = ...;
ctx.getResource("/some/resource/path/myTemplate.txt");
Kotlin
val ctx: FileSystemXmlApplicationContext = ...
ctx.getResource("some/resource/path/myTemplate.txt")
val ctx: FileSystemXmlApplicationContext = ...
ctx.getResource("/some/resource/path/myTemplate.txt")
На практике, если вам нужны истинные абсолютные пути к файловой системе, вам следует избегать использования абсолютных путей с FileSystemResource или FileSystemXmlApplicationContext и принудительно использовать UrlResource с помощью URL префикса file: . Следующие примеры показывают, как это сделать:
Java
// фактический тип контекста не имеет значения, Resource всегда будет UrlResource
ctx.getResource("file:///some/resource/path/myTemplate.txt");
// заставляем этот FileSystemXmlApplicationContext загружать его определение через UrlResource
ApplicationContext ctx =
new FileSystemXmlApplicationContext("file:///conf/context.xml");
Kotlin
// фактический тип контекста не имеет значения, Resource всегда будет UrlResource
ctx.getResource("file:///some/resource/path/myTemplate.txt")
// заставляем этот FileSystemXmlApplicationContext загружать его определение через UrlResource
val ctx = FileSystemXmlApplicationContext("file:///conf/context.xml")
Читайте также:
- Spring Resource: контексты приложения и пути ресурсов, создание контекстов приложения
- Spring Resource: контексты приложения и пути ресурсов, подстановочные знаки в путях ресурсов конструктора контекста приложения
- Spring Resource: интерфейс ResourceLoader
Комментарии
Отправить комментарий