Last en ressurs som en streng om våren

1. Oversikt

I denne opplæringen vil vi se på forskjellige måter å injiser innholdet i en ressurs som inneholder tekst som en streng i vårbønnene.

Vi ser på å finne ressursen og lese innholdet.

Vi vil også demonstrere hvordan du deler de lastede ressursene på tvers av flere bønner. Vi viser dette ved bruk av merknader relatert til avhengighetsinjeksjon, selv om det samme også kan oppnås ved å bruke XML-basert injeksjon og erklære bønnene i XML-eiendomsfilen.

2. Bruke Ressurs

Vi kan forenkle lokaliseringen av en ressursfil ved å bruke Ressurs grensesnitt. Spring hjelper oss med å finne og lese en ressurs ved hjelp av ressurslaster, som bestemmer hvilken Ressurs implementering å velge, avhengig av stien som er gitt. De Ressurs er effektivt en måte å få tilgang til innholdet på ressursen, snarere enn selve innholdet.

La oss se noen måter å skaffe en Ressurs eksempel for ressurser på klassestien.

2.1. Ved hjelp av ResourceLoader

Vi kan bruke klassen ResourceLoader hvis vi foretrekker å bruke lat lasting:

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

Vi kan også injisere ResourceLoader inn i bønnen vår med @Autowired:

@Autowired privat ResourceLoader resourceLoader;

2.2 Bruke @Ressurs

Vi kan injisere en Ressurs direkte inn i en vårbønne med @Verdi:

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

3. Konvertering fra Ressurs til String

Når vi har tilgang til Ressurs vi trenger å kunne lese den inn i en String. La oss lage en ResourceReader bruksklasse med en statisk metode asString å gjøre dette for oss.

Først må vi skaffe oss en InputStream:

InputStream inputStream = resource.getInputStream ();

Vårt neste skritt er å ta dette InputStream og konverter den til en String. Vi kan bruke vårens egne 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); } catch (IOException e) {throw new UncheckedIOException (e); }} // flere verktøymetoder}

Det er mange andre måter å oppnå dette på, for eksempel å bruke copyToString av vårens StreamUtils klasse

La oss også lage en annen verktøymetode readFileToString, som vil hente Ressurs for en sti, og ring asString metode for å konvertere den til en String.

offentlig statisk streng readFileToString (strengbane) {ResourceLoader resourceLoader = ny DefaultResourceLoader (); Ressursressurs = resourceLoader.getResource (bane); return asString (ressurs); }

4. Legge til en Konfigurasjon Klasse

Hvis hver bønne måtte injisere ressurs Strings hver for seg, er det en sjanse for både kodekopiering og mer bruk av minne ved at bønner har sin egen individuelle kopi av String.

Vi kan oppnå en bedre løsning ved å injisere ressursens innhold i en eller flere vårbønner når vi laster inn applikasjonskonteksten. På denne måten kan vi skjule implementeringsdetaljene for å lese ressursen fra de forskjellige bønner som trenger å bruke dette innholdet.

@Configuration public class LoadResourceConfig {// Bean Declarations}

4.1. Bruke en bønne som holder ressursstrengen

La oss erklære at bønner holder ressursinnholdet i en @Konfigurasjon klasse:

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

La oss nå injisere de registrerte bønnene til feltene ved å legge til en @Autowired kommentar:

offentlig klasse LoadResourceAsStringIntegrationTest {private static final String EXPECTED_RESOURCE_VALUE = "..."; // Strengverdien til filinnholdet @Autowired @Qualifier ("resourceString") privat streng resourceString; @Test offentlig ugyldig givenUsingResourceStringBean_whenConvertingAResourceToAString_thenCorrect () {assertEquals (EXPECTED_RESOURCE_VALUE, resourceString); }}

I dette tilfellet bruker vi @Kvalifiserende kommentar og navnet på bønnen, som vi kan trenge å injisere flere felt av samme typeString.

Vi bør merke oss at bønnenavnet som brukes i kvalifiseringen er avledet av navnet på metoden som oppretter bønnen i konfigurasjonsklassen.

5. Bruke SpEL

Til slutt, la oss se hvordan vi kan bruke Spring Expression Language til å beskrive koden som trengs for å laste en ressursfil direkte inn i et felt i klassen vår.

La oss bruke @Verdi kommentar for å injisere filinnholdet i feltet resourceStringUsingSpel:

offentlig klasse LoadResourceAsStringIntegrationTest {private static final String EXPECTED_RESOURCE_VALUE = "..."; // Strengverdien til filinnholdet @Value ("# {T (com.baeldung.loadresourceasstring.ResourceReader) .readFileToString ('classpath: resource.txt')}") private String resourceStringUsingSpel; @Test offentlig ugyldig givenUsingSpel_whenConvertingAResourceToAString_thenCorrect () {assertEquals (EXPECTED_RESOURCE_VALUE, resourceStringUsingSpel); }}

Her har vi ringt ResourceReader # readFileToString som beskriver plasseringen av filen ved hjelp av a “Klassesti:” -prefiks sti inne i vår @Verdi kommentar.

For å redusere mengden kode i SpEL, har vi laget en hjelpemetode i klassen ResourceReader som bruker Apache Commons FileUtils for å få tilgang til filen fra den oppgitte stien:

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

6. Konklusjon

I denne opplæringen har vi gjennomgått noen av måtene å konvertere en ressurs til en String.

Først av alt så vi hvordan vi skulle produsere en Ressurs for å få tilgang til filen, og hvordan du leser fra Ressurs til String.

Deretter viste vi også hvordan vi skjuler implementeringen av ressurslastingen, og lar strenginnholdet deles på tvers av bønner ved å lage kvalifiserte bønner i en @Konfigurasjon, slik at strengene kan kobles til automatisk.

Til slutt brukte vi SpEL, som gir en kompakt og umiddelbar løsning, selv om det krevde en tilpasset hjelperfunksjon for å hindre at den ble for kompleks.

Som alltid kan koden for eksemplene finnes på GitHub


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