Laad een bron als een tekenreeks in het voorjaar

1. Overzicht

In deze tutorial bekijken we verschillende manieren om injecteer de inhoud van een bron met tekst als een string in onze Spring Beans.

We zullen kijken naar het lokaliseren van de bron en de inhoud ervan lezen.

We laten ook zien hoe u de geladen bronnen over verschillende bonen kunt delen. We zullen dit laten zien door het gebruik van annotaties met betrekking tot afhankelijkheidsinjectie, maar hetzelfde kan ook worden bereikt door op XML gebaseerde injectie te gebruiken en de bonen in het XML-eigenschappenbestand te declareren.

2. Met behulp van Bron

We kunnen het lokaliseren van een bronbestand vereenvoudigen door de Bron koppel. Spring helpt ons een bron te vinden en te lezen met behulp van de bronlader, die beslist welke Bron implementatie om te kiezen, afhankelijk van het opgegeven pad. De Bron is in feite een manier om toegang te krijgen tot de inhoud van de bron, in plaats van de inhoud zelf.

Laten we eens kijken naar enkele manieren om een Bron instantie voor bronnen op het klassenpad.

2.1. Gebruik makend van ResourceLoader

We kunnen de klas gebruiken ResourceLoader als we de voorkeur geven aan lazy loading:

ResourceLoader resourceLoader = nieuwe DefaultResourceLoader (); Resource resource = resourceLoader.getResource ("classpath: resource.txt");

We kunnen ook de ResourceLoader in onze boon met @Autowired:

@Autowired private ResourceLoader resourceLoader;

2.2 Gebruiken @Resource

We kunnen een Bron direct in een lenteboon met @Waarde:

@Value ("classpath: resource.txt") privéresource;

3. Omzetten van Bron naar Draad

Zodra we toegang hebben tot het Bron we moeten het kunnen lezen in een Draad. Laten we een ResourceReader utility class met een statische methode asString om dit voor ons te doen.

Eerst moeten we een InputStream:

InputStream inputStream = resource.getInputStream ();

Onze volgende stap is om dit te doen InputStream en converteer het naar een Draad. We kunnen die van Spring gebruiken FileCopyUtils # copyToString methode:

openbare klasse ResourceReader {openbare statische String asString (bronbron) {probeer (Reader reader = nieuwe InputStreamReader (resource.getInputStream (), UTF_8)) {return FileCopyUtils.copyToString (lezer); } catch (IOException e) {throw new UncheckedIOException (e); }} // meer hulpprogramma-methoden}

Er zijn veel andere manieren om dit te bereiken, bijvoorbeeld met copyToString van de lente StreamUtils klasse

Laten we ook een andere hulpprogramma-methode maken readFileToString, die het Bron voor een pad, en bel de asString methode om het naar een Draad.

openbare statische tekenreeks readFileToString (tekenreekspad) {ResourceLoader resourceLoader = nieuwe DefaultResourceLoader (); Resource resource = resourceLoader.getResource (pad); return asString (resource); }

4. Een Configuratie Klasse

Als elke boon middelen zou moeten injecteren Draads afzonderlijk is er een kans op zowel codeduplicatie als meer geheugengebruik door bonen die hun eigen individuele kopie van het Draad.

We kunnen een nettere oplossing bereiken door de inhoud van de bron in een of meerdere Spring Beans te injecteren bij het laden van de toepassingscontext. Op deze manier kunnen we de implementatiedetails voor het lezen van de bron verbergen voor de verschillende bonen die deze inhoud nodig hebben.

@Configuration openbare klasse LoadResourceConfig {// Bean Declarations}

4.1. Een boon gebruiken die de bronstring vasthoudt

Laten we aangeven dat bonen de broninhoud in een @Configuratie klasse:

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

Laten we nu de geregistreerde bonen in de velden injecteren door een @Autowired annotatie:

openbare klasse LoadResourceAsStringIntegrationTest {privé statische laatste String EXPECTED_RESOURCE_VALUE = "..."; // De tekenreekswaarde van de bestandsinhoud @Autowired @Qualifier ("resourceString") private String resourceString; @Test openbare ongeldige gegevenUsingResourceStringBean_whenConvertingAResourceToAString_thenCorrect () {assertEquals (EXPECTED_RESOURCE_VALUE, resourceString); }}

In dit geval gebruiken we de @Kwalificatie annotatie en de naam van de boon, zoals we moeten mogelijk meerdere velden van hetzelfde type injecterenDraad.

We moeten opmerken dat de bean-naam die in de kwalificatie wordt gebruikt, is afgeleid van de naam van de methode die de bean in de configuratieklasse maakt.

5. Met behulp van SpEL

Laten we tot slot kijken hoe we de Spring Expression Language kunnen gebruiken om de code te beschrijven die nodig is om een ​​bronbestand rechtstreeks in een veld in onze klas te laden.

Laten we de @Waarde annotatie om de bestandsinhoud in het veld te injecteren resourceStringUsingSpel:

openbare klasse LoadResourceAsStringIntegrationTest {privé statische laatste String EXPECTED_RESOURCE_VALUE = "..."; // De tekenreekswaarde van de bestandsinhoud @Value ("# {T (com.baeldung.loadresourceasstring.ResourceReader) .readFileToString ('classpath: resource.txt')}") private String resourceStringUsingSpel; @Test openbare leegte gegevenUsingSpel_whenConvertingAResourceToAString_thenCorrect () {assertEquals (EXPECTED_RESOURCE_VALUE, resourceStringUsingSpel); }}

Hier hebben we gebeld ResourceReader # readFileToString beschrijft de locatie van het bestand met behulp van een "Classpath:" -voorvoegsel pad binnen onze @Waarde annotatie.

Om de hoeveelheid code in de SpEL te verminderen, hebben we een hulpmethode in de klas gemaakt ResourceReader die Apache Commons gebruikt FileUtils om het bestand te openen via het opgegeven pad:

openbare klasse ResourceReader {openbare statische String readFileToString (String-pad) gooit IOException {return FileUtils.readFileToString (ResourceUtils.getFile (pad), StandardCharsets.UTF_8); }}

6. Conclusie

In deze zelfstudie hebben we enkele manieren besproken om converteer een bron naar een Draad.

Allereerst hebben we gezien hoe we een Bron om toegang te krijgen tot het bestand en hoe u kunt lezen van Bron naar Draad.

Vervolgens hebben we ook laten zien hoe de implementatie van het laden van bronnen kan worden verborgen en hoe de inhoud van de tekenreeks kan worden gedeeld tussen bonen door gekwalificeerde bonen te maken in een @Configuratie, waardoor de snaren automatisch kunnen worden bedraad.

Ten slotte hebben we SpEL gebruikt, dat een compacte en onmiddellijke oplossing biedt, hoewel het een aangepaste helperfunctie vereist om te voorkomen dat het te complex wordt.

Zoals altijd is de code voor de voorbeelden te vinden op GitHub