Muatkan Sumber sebagai Rentetan pada Musim Bunga

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat pelbagai cara untuk menyuntikkan isi sumber yang mengandungi teks sebagai tali ke dalam kacang musim bunga kami .

Kami akan mencari sumber dan membaca kandungannya.

Juga, kami akan menunjukkan cara berkongsi sumber yang dimuatkan di beberapa biji. Kami akan menunjukkannya melalui penggunaan anotasi yang berkaitan dengan suntikan ketergantungan, walaupun hal yang sama juga dapat dicapai dengan menggunakan suntikan berasaskan XML dan menyatakan kacang dalam fail harta XML.

2. Menggunakan Sumber

Kami dapat mempermudah mencari fail sumber dengan menggunakan antara muka Sumber . Spring membantu kami mencari dan membaca sumber menggunakan pemuat sumber, yang menentukan pelaksanaan Sumber mana yang akan dipilih bergantung pada jalan yang disediakan. The Resource adalah berkesan cara untuk mengakses kandungan sumber, bukannya kandungan itu sendiri.

Mari lihat beberapa cara untuk mendapatkan contoh Sumber untuk sumber di classpath.

2.1. Menggunakan ResourceLoader

Kita boleh menggunakan kelas ResourceLoader jika kita lebih suka menggunakan pemuatan malas:

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

Kami juga boleh menyuntikkan ResourceLoader ke kacang kami dengan @Autowired :

@Autowired private ResourceLoader resourceLoader;

2.2 Menggunakan @Resource

Kita boleh memasukkan Sumber secara langsung ke kacang musim bunga dengan @Value :

@Value("classpath:resource.txt") private Resource resource;

3. Menukar dari Sumber ke Rentetan

Setelah kita mendapat akses ke Sumber, kita perlu dapat membacanya menjadi Rentetan . Mari buat kelas utiliti ResourceReader dengan kaedah statik sebagaiString untuk melakukan ini untuk kita.

Pertama, kita mesti memperoleh InputStream :

InputStream inputStream = resource.getInputStream();

Langkah seterusnya adalah mengambil InputStream ini dan mengubahnya menjadi String . Kita boleh menggunakan kaedah FileCopyUtils # copyToString Spring sendiri :

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); } } // more utility methods }

Terdapat banyak cara-cara lain untuk mencapai ini, sebagai contoh, menggunakan copyToString daripada Spring StreamUtils kelas

Mari juga buat kaedah utiliti lain readFileToString, yang akan mengambil Sumber untuk jalan, dan panggil kaedah asString untuk menukarnya menjadi String .

public static String readFileToString(String path) { ResourceLoader resourceLoader = new DefaultResourceLoader(); Resource resource = resourceLoader.getResource(path); return asString(resource); }

4. Menambah Kelas Konfigurasi

Sekiranya setiap kacang harus menyuntikkan String sumber secara individu, ada kemungkinan pendua kod dan penggunaan memori lebih banyak oleh kacang yang mempunyai salinan String masing-masing .

Kami dapat mencapai penyelesaian yang lebih kemas dengan menyuntik kandungan sumber ke satu atau beberapa biji kacang semasa memuatkan konteks aplikasi. Dengan cara ini, kita dapat menyembunyikan perincian pelaksanaan untuk membaca sumber dari pelbagai kacang yang perlu menggunakan kandungan ini.

@Configuration public class LoadResourceConfig { // Bean Declarations }

4.1. Menggunakan Kekacang Memegang Rentetan Sumber

Mari nyatakan kacang untuk menyimpan kandungan sumber dalam kelas @Konfigurasi :

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

Sekarang mari kita masukkan kacang yang didaftarkan ke ladang dengan menambahkan anotasi @Autowired :

public class LoadResourceAsStringIntegrationTest { private static final String EXPECTED_RESOURCE_VALUE = "..."; // The string value of the file content @Autowired @Qualifier("resourceString") private String resourceString; @Test public void givenUsingResourceStringBean_whenConvertingAResourceToAString_thenCorrect() { assertEquals(EXPECTED_RESOURCE_VALUE, resourceString); } }

Dalam kes ini, kami menggunakan anotasi @Qualifier dan nama kacang, kerana kami mungkin perlu menyuntikkan beberapa bidang dengan jenis yang sama - String .

Kita harus perhatikan bahawa nama kacang yang digunakan dalam kelayakan berasal dari nama kaedah yang membuat kacang dalam kelas konfigurasi.

5. Menggunakan SpEL

Akhirnya, mari kita lihat bagaimana kita dapat menggunakan Bahasa Ekspresi Musim Semi untuk menerangkan kod yang diperlukan untuk memuatkan fail sumber terus ke medan di kelas kita.

Mari gunakan anotasi @Value untuk menyuntikkan kandungan fail ke sumber lapanganStringUsingSpel :

public class LoadResourceAsStringIntegrationTest { private static final String EXPECTED_RESOURCE_VALUE = "..."; // The string value of the file content @Value( "#{T(com.baeldung.loadresourceasstring.ResourceReader).readFileToString('classpath:resource.txt')}" ) private String resourceStringUsingSpel; @Test public void givenUsingSpel_whenConvertingAResourceToAString_thenCorrect() { assertEquals(EXPECTED_RESOURCE_VALUE, resourceStringUsingSpel); } }

Di sini kita telah memanggil ResourceReader # readFileToString yang menerangkan lokasi fail dengan menggunakan "classpath:" - jalan awalan di dalam anotasi @Value kami .

Untuk mengurangkan jumlah kod dalam SpEL, kami telah membuat kaedah pembantu di kelas ResourceReader yang menggunakan Apache Commons FileUtils untuk mengakses fail dari jalan yang disediakan:

public class ResourceReader { public static String readFileToString(String path) throws IOException { return FileUtils.readFileToString(ResourceUtils.getFile(path), StandardCharsets.UTF_8); } }

6. Kesimpulannya

Dalam tutorial ini, kami telah mengkaji beberapa cara untuk menukar sumber ke String .

Pertama sekali, kami melihat bagaimana menghasilkan Sumber untuk mengakses fail, dan cara membaca dari Sumber ke String.

Seterusnya, kami juga menunjukkan cara menyembunyikan pelaksanaan pemuatan sumber daya, dan membiarkan kandungan rentetan dibagikan di seluruh kacang dengan membuat kacang yang memenuhi syarat dalam @ Konfigurasi , yang membolehkan rentetan automatik.

Akhirnya, kami menggunakan SpEL, yang menyediakan penyelesaian ringkas dan segera, walaupun memerlukan fungsi pembantu khusus untuk menghentikannya menjadi terlalu kompleks.

Seperti biasa, kod untuk contoh boleh didapati di GitHub