Indlæs en ressource som en streng om foråret

1. Oversigt

I denne vejledning ser vi på forskellige måder at indsprøjt indholdet af en ressource, der indeholder tekst som en streng, i vores forårsbønner.

Vi ser på at finde ressourcen og læse dens indhold.

Vi demonstrerer også, hvordan man deler de indlæste ressourcer på tværs af flere bønner. Vi viser dette ved brug af annoteringer relateret til afhængighedsinjektion, selvom det samme også kan opnås ved at bruge XML-baseret injektion og erklære bønnerne i XML-egenskabsfilen.

2. Brug Ressource

Vi kan forenkle lokaliseringen af ​​en ressourcefil ved hjælp af Ressource interface. Spring hjælper os med at finde og læse en ressource ved hjælp af ressourceindlæseren, der bestemmer hvilken Ressource implementering at vælge afhængigt af den angivne vej. Det Ressource er faktisk en måde at få adgang til indholdet af ressourcen i stedet for selve indholdet.

Lad os se nogle måder at erhverve en Ressource eksempel på ressourcer på klassestien.

2.1. Ved brug af ResourceLoader

Vi kan bruge klassen ResourceLoader hvis vi foretrækker at bruge doven belastning:

ResourceLoader resourceLoader = ny DefaultResourceLoader (); Ressource ressource = resourceLoader.getResource ("classpath: resource.txt");

Vi kan også indsprøjte ResourceLoader ind i vores bønne med @Autowired:

@Autowired privat ResourceLoader resourceLoader;

2.2 Brug @Ressource

Vi kan injicere en Ressource direkte i en springbønne med @Værdi:

@Value ("classpath: resource.txt") privat ressource ressource;

3. Konvertering fra Ressource til Snor

Når vi har adgang til Ressource vi skal være i stand til at læse det i en Snor. Lad os oprette en ResourceReader utility klasse med en statisk metode asString at gøre dette for os.

Først skal vi erhverve en InputStream:

InputStream inputStream = resource.getInputStream ();

Vores næste skridt er at tage dette InputStream og konverter det til en Snor. Vi kan bruge Spring's egen FileCopyUtils # copyToString metode:

public class ResourceReader {public static String asString (Resource resource) {try (Reader reader = new InputStreamReader (resource.getInputStream (), UTF_8)) {return FileCopyUtils.copyToString (reader); } fange (IOException e) {smid ny UncheckedIOException (e); }} // flere hjælpemetoder}

Der er mange andre måder at opnå dette på, for eksempel ved hjælp af copyToString af forårets StreamUtils klasse

Lad os også oprette en anden hjælpemetode readFileToString, som vil hente Ressource for en sti, og ring til asString metode til at konvertere den til en Snor.

offentlig statisk streng readFileToString (strengsti) {ResourceLoader resourceLoader = ny DefaultResourceLoader (); Ressource ressource = resourceLoader.getResource (sti); returnere asString (ressource); }

4. Tilføjelse af en Konfiguration Klasse

Hvis hver bønne skulle indsprøjte ressource Snors hver for sig, er der en chance for både kopiering af kode og mere brug af hukommelse ved at bønner har deres egen individuelle kopi af Snor.

Vi kan opnå en pænere løsning ved at indsprøjte ressourceindholdet i en eller flere Spring-bønner efter indlæsning af applikationskonteksten. På denne måde kan vi skjule implementeringsoplysningerne til læsning af ressourcen for de forskellige bønner, der har brug for dette indhold.

@Configuration public class LoadResourceConfig {// Bean Declarations}

4.1. Brug af en bønne, der holder ressourcestrengen

Lad os erklære bønner til at indeholde ressourceindholdet i en @Konfiguration klasse:

@Bean public String resourceString () {return ResourceReader.readFileToString ("resource.txt"); }

Lad os nu indsprøjte de registrerede bønner til markerne ved at tilføje en @Autowired kommentar:

offentlig klasse LoadResourceAsStringIntegrationTest {privat statisk endelig streng EXPECTED_RESOURCE_VALUE = "..."; // Strengværdien af ​​filindholdet @Autowired @Qualifier ("resourceString") privat String resourceString; @Test offentligt ugyldigt givenUsingResourceStringBean_whenConvertingAResourceToAString_thenCorrect () {assertEquals (EXPECTED_RESOURCE_VALUE, resourceString); }}

I dette tilfælde bruger vi @Kvalifikator kommentar og navnet på bønnen, som Vi skal muligvis indsprøjte flere felter af samme typeSnor.

Vi skal bemærke, at bønnenavnet, der bruges i kvalifikationen, stammer fra navnet på den metode, der opretter bønnen i konfigurationsklassen.

5. Brug af SpEL

Lad os endelig se, hvordan vi kan bruge Spring Expression Language til at beskrive den kode, der er nødvendig for at indlæse en ressourcefil direkte i et felt i vores klasse.

Lad os bruge @Værdi kommentar for at indsprøjte filindholdet i marken resourceStringUsingSpel:

offentlig klasse LoadResourceAsStringIntegrationTest {privat statisk endelig streng EXPECTED_RESOURCE_VALUE = "..."; // Strengværdien af ​​filindholdet @Value ("# {T (com.baeldung.loadresourceasstring.ResourceReader) .readFileToString ('classpath: resource.txt')}") private String resourceStringUsingSpel; @Test offentlig ugyldighed givenUsingSpel_whenConvertingAResourceToAString_thenCorrect () {assertEquals (EXPECTED_RESOURCE_VALUE, resourceStringUsingSpel); }}

Her har vi ringet ResourceReader # readFileToString beskriver filens placering ved hjælp af en “Klassesti:” -præfikset sti inde i vores @Værdi kommentar.

For at reducere mængden af ​​kode i SpEL har vi oprettet en hjælpemetode i klassen ResourceReader der bruger Apache Commons FileUtils for at få adgang til filen fra den angivne sti:

offentlig klasse ResourceReader {offentlig statisk streng readFileToString (streng sti) kaster IOException {return FileUtils.readFileToString (ResourceUtils.getFile (sti), StandardCharsets.UTF_8); }}

6. Konklusion

I denne vejledning har vi gennemgået nogle af måderne til konvertere en ressource til en Snor.

Først og fremmest så vi, hvordan man fremstiller en Ressource for at få adgang til filen, og hvordan man læser fra Ressource til Snor.

Dernæst viste vi også, hvordan man skjuler implementeringen af ​​ressourceindlæsning og tillader, at strengindholdet deles på tværs af bønner ved at oprette kvalificerede bønner i en @Konfiguration, der gør det muligt for trådene at blive automatisk kablet.

Endelig brugte vi SpEL, som giver en kompakt og øjeblikkelig løsning, selvom det krævede en brugerdefineret hjælperfunktion for at forhindre, at den blev for kompleks.

Som altid kan koden for eksemplerne findes på GitHub


$config[zx-auto] not found$config[zx-overlay] not found