[JAVA] Eine Übersicht über die Spring Framework Resource-Oberfläche

Überblick

Dies ist ein Memo, als ich über den Zugriff auf Ressourcendateien mithilfe der Ressourcenschnittstelle und der Implementierungsklasse von Spring Framework nachdachte.

Umgebung

Referenz

Resource

Since 28.12.2003

Interface for a resource descriptor that abstracts from the actual type of underlying resource, such as a file or class path resource.

So erhalten Sie eine Instanz der Ressourcenschnittstelle

  1. Verwenden Sie die Implementierungsklasse
  2. Verwenden Sie "ResourceLoader"
  3. Verwenden Sie die Annotation @ Value

Und so weiter.

Verwendung von Implementierungsklassen

Verwendung der entsprechenden Implementierungsklasse für die Ressourcenschnittstelle in Abhängigkeit vom Speicherort der Ressourcendatei. Beispielsweise gibt es "ClassPathResource" für den Zugriff auf Ressourcen im Klassenpfad, "UrlResource" für den Zugriff auf Ressourcen im Netzwerk und "FileUrlResource" für den Zugriff auf Ressourcen im Dateisystem.

ClassPathResource

Since 28.12.2003

Resource implementation for class path resources. Uses either a given ClassLoader or a given Class for loading resources.

Konstrukteur
ClassPathResource(String path)
ClassPathResource(String path, Class<?> clazz)
ClassPathResource(String path, ClassLoader classLoader)

Code

Resource resource = new ClassPathResource("config/app.properties");

Da die Ressourcenschnittstelle von der InputStreamSource-Schnittstelle erbt, können Sie den InputStream der Ressourcendatei mit der Methode getInputStream abrufen.

String read(Resource resource) {
    try (InputStream in = resource.getInputStream();
         BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) {
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        return sb.toString();
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}

Da die Ressourcenschnittstelle auch über eine getFile-Methode verfügt, kann diese wie folgt beschrieben werden. Da jedoch eine Ausnahme ausgelöst wird, wenn sich die Ressource im Klassenpfad oder im Netzwerk befindet, befindet sich die Ressourcendatei normalerweise im Dateisystem. Ich denke, Sie sollten es nur in bestimmten Fällen verwenden.

String read(Resource resource) {
    try {
        return Files.readString(resource.getFile().toPath());
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}

UrlResource

Since 28.12.2003

Resource implementation for java.net.URL locators. Supports resolution as a URL and also as a File in case of the "file:" protocol.

Konstrukteur
UrlResource(String path)
UrlResource(String protocol, String location)
UrlResource(String protocol, String location, String fragment)
UrlResource(java.net.URI uri)
UrlResource(java.net.URL url)

Code

Resource urlResource = new UrlResource("http://localhost:8887/config/app.properties");

FileUrlResource

Since 5.0.2

Subclass of UrlResource which assumes file resolution, to the degree of implementing the WritableResource interface for it. This resource variant also caches resolved File handles from getFile().

Konstrukteur
FileUrlResource(String location)
FileUrlResource(java.net.URL url)

Code

Resource fileUrlResource = new FileUrlResource("c://var//config/app.properties");

Verwendung von ResourceLoader

Since 10.03.2004

Strategy interface for loading resources (e.. class path or file system resources). An ApplicationContext is required to provide this functionality, plus extended ResourcePatternResolver support. DefaultResourceLoader is a standalone implementation that is usable outside an ApplicationContext, also used by ResourceEditor.

ResourceLoader Instanz der Ressource unter Verwendung der Implementierungsklasse der Schnittstelle Wenn Sie erhalten, besteht der Vorteil, dass Sie die Implementierungsklasse der Ressourcenschnittstelle nicht kennen müssen.

Beim Spring Boot wird ResourceLoader eine Instanz der Klasse "AnnotationConfigServletWebServerApplicationContext" injiziert. (Diese Klasse befindet sich im Spring Boot-Projekt.)

@Autowired
private ResourceLoader resourceLoader;
// org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext

classpath

Schreiben beginnend mit "classpath:" fügt eine Instanz der "ClassPathResource" -Klasse ein.

Resource resource = resourceLoader.getResource("classpath:config/app.properties");
// org.springframework.core.io.ClassPathResource

url

Wenn Sie es in das http-Schema schreiben, wird eine Instanz der UrlResource-Klasse eingefügt.

Resource resource = resourceLoader.getResource("http://localhost:8887/config/app.properties");
// org.springframework.core.io.UrlResource

file

Eine Instanz der Klasse "FileUrlResource" wird wie im Dateischema beschrieben eingefügt.

Resource resource = resourceLoader.getResource("file:///c://config/app.properties");
// org.springframework.core.io.FileUrlResource

Verwendung der Annotation "@ Value"

Abhängig vom Wert der Value-Annotation fügt das Spring Framework eine Instanz der entsprechenden Implementierungsklasse ein. Das Format des in der Anmerkung beschriebenen Werts entspricht dem von ResourceLoader.

classpath

@Value("classpath:config/app.properties")
private Resource classpathResource;
// org.springframework.core.io.ClassPathResource

url

@Value("http://localhost:8887/config/app.properties")
private Resource urlResource;
// org.springframework.core.io.UrlResource

file

@Value("file:///c://config/app.properties")
private Resource fileUrlResource;
// org.springframework.core.io.FileUrlResource

Verwendung von ResourceUtils

Since 1.1.5

Utility methods for resolving resource locations to files in the file system. Mainly for internal use within the framework.

Wie in der API-Dokumentation beschrieben, handelt es sich um eine Dienstprogrammklasse, die hauptsächlich im Spring Framework verwendet wird. Es gibt keine Aussage, dass es nicht auf der Anwendungsseite verwendet werden sollte, aber es sollte mit Vorsicht verwendet werden, da es für die Verwendung innerhalb des Frameworks vorgesehen ist.

classpath

File file = ResourceUtils.getFile("classpath:config/app.properties");

url

URL url = ResourceUtils.getURL("http://localhost:8887/config/app.properties");

file

File file = ResourceUtils.getFile("file:///c://var//config/app.properties");

StreamUtils

Since 3.2.2

Simple utility methods for dealing with streams. The copy methods of this class are similar to those defined in FileCopyUtils except that all affected streams are left open when done. All copy methods use a block size of 4096 bytes. Mainly for use within the framework, but also useful for application code.

Das Spring Framework verfügt auch über Dienstprogrammklassen, die Streams verarbeiten. Sie können die copyToString-Methode dieser Klasse verwenden, um Ihren Code wie folgt zu vereinfachen:

String data = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);

Recommended Posts

Eine Übersicht über die Spring Framework Resource-Oberfläche
Eine Aufzeichnung über das Studium des Spring Framework von Grund auf neu
Überprüfen Sie die Notizen für die Klasse java.util.Scanner
Informationen zur ersten Anzeige von Spring Framework
Überprüfen Sie die Notizen für die Klasse java.util.Optional
Ein Überprüfungshinweis für die Klasse java.util.Objects
Überprüfen Sie die Notizen für das Paket java.time.temporal
Über den offiziellen Startleitfaden für Spring Framework
Eine Überprüfung des von Rails-Anfängern verwendeten Codes
Eine Übersicht über das native Java-Framework Quarkus von Kubernetes
Hinweise zum Umfang
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Ein Hinweis zum Seed-Feature von Ruby on Rails
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Spring Framework 5.0 Zusammenfassung der wichtigsten Änderungen
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Hinweis zum Pfad von request.getRequestDispatcher
Ein Memorandum über das FizzBuzz-Problem
Filtern Sie das Ergebnis von BindingResult [Spring]
Wir werden eine Spring Framework-Entwicklungsumgebung in der lokalen Umgebung erstellen.
(Memo) Holen Sie sich mit Hilfe von Gradle eine Reihe von abhängigen Bibliotheksgläsern
Die Geschichte der Begegnung mit Spring Custom Annotation
Notieren Sie sich die Ruby-Schlüsselwortargumente
Ein Hinweis zur libGDX Utils-Klasse
Warum Frühling als leichtes Gerüst betrachten
Funktionen des Spring Frameworks für Java-Entwickler
Finden Sie den Unterschied von einem Vielfachen von 10
[Java] [Spring] Testen Sie das Verhalten des Loggers
Überprüfen Sie die Funktion der Schnittstelle über den Thread
Einführung des Spring Boot Actuator, einer Funktion, die die Bedienung von Spring Boot-Anwendungen erleichtert
Ein kurzer Hinweis zur Verwendung von jshell mit dem offiziellen Docker-Image des JDK
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Machen Sie einen Rand links vom TextField
Messen Sie die Größe eines Ordners mit Java
Stellen Sie die Zeit von LocalDateTime auf eine bestimmte Zeit ein
Ein Hinweis, wenn der Heroku-Befehl nicht mehr verfügbar ist
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen
Transaktionsmanagement des integrierten Frameworks "Apache Camel"
Stimmt die Anmerkungen auf der Schnittstelle mit Spring AOP überein
Ein Memo über den Fluss von Rails und Vue
Der offizielle Name von Spring MVC ist Spring Web MVC
Lassen Sie uns den Ablauf der Erteilung des Autorisierungscodes mit Spring Security OAuth-Part 1: Review of OAuth 2.0 erleben