Mengawal Pesanan Penciptaan Kacang dengan Anotasi @DependsOn

1. Gambaran keseluruhan

Musim bunga, secara lalai, menguruskan kitaran hidup kacang dan mengatur urutan permulaannya.

Tetapi, kita masih boleh menyesuaikannya berdasarkan keperluan kita. Kita boleh memilih antara muka SmartLifeCycle atau anotasi @DependsOn untuk menguruskan pesanan inisialisasi .

Tutorial ini menerangkan anotasi @DependsOn dan tingkah lakunya sekiranya terdapat ketergantungan kacang atau bulatan yang hilang. Atau sekiranya hanya memerlukan sebiji kacang yang dimulakan sebelum yang lain.

2. Maven

Pertama sekali, mari kita import kebergantungan konteks musim bunga dalam fail pom.xml kami . Kita harus selalu merujuk kepada Maven Central untuk versi kebergantungan terkini:

 org.springframework spring-context 5.2.8.RELEASE 

3. @DependsOn

Kita harus menggunakan penjelasan ini untuk menentukan kebergantungan kacang. Musim bunga menjamin bahawa kacang yang ditentukan akan diinisialisasi sebelum mencuba inisialisasi kacang semasa.

Katakan kita mempunyai FileProcessor yang bergantung pada FileReader dan FileWriter . Dalam kes ini, FileReader dan FileWriter harus diinisialisasi sebelum FileProcessor .

4. Konfigurasi

Fail konfigurasi adalah kelas Java murni dengan anotasi @Configuration :

@Configuration @ComponentScan("com.baeldung.dependson") public class Config { @Bean @DependsOn({"fileReader","fileWriter"}) public FileProcessor fileProcessor(){ return new FileProcessor(); } @Bean("fileReader") public FileReader fileReader() { return new FileReader(); } @Bean("fileWriter") public FileWriter fileWriter() { return new FileWriter(); } }

FileProcessor menentukan kebergantungannya dengan @DependsOn . Kami juga dapat memberi penjelasan kepada Komponen dengan @DependsOn:

@Component @DependsOn({"filereader", "fileWriter"}) public class FileProcessor {}

5. Penggunaan

Mari kita buat Fail satu kelas . Setiap kacang mengemas kini teks dalam Fail . FileReader mengemas kini sebagai dibaca. FileWriter mengemas kini sebagai tulis dan FileProcessor mengemas kini teks semasa diproses:

@Test public void WhenFileProcessorIsCreated_FileTextContains_Processed() { FileProcessor processor = context.getBean(FileProcessor.class); assertTrue(processor.process().endsWith("processed")); }

5.1. Kehilangan Ketergantungan

Sekiranya tiada kebergantungan, Spring melemparkan BeanCreationException dengan pengecualian asas NoSuchBeanDefinitionException . Baca lebih lanjut mengenai NoSuchBeanDefinitionException di sini.

Contohnya, kacang dummyFileProcessor bergantung pada kacang dummyFileWriter . Oleh kerana dummyFileWriter tidak wujud, ia membuang BeanCreationException:

@Test(expected=NoSuchBeanDefinitionException.class) public void whenDependentBeanNotAvailable_ThrowsNosuchBeanDefinitionException(){ context.getBean("dummyFileProcessor"); }

5.2. Ketergantungan Pekeliling

Juga, dalam kes ini, ia membuang BeanCreationException dan menyoroti bahawa kacang mempunyai pergantungan bulat:

@Bean("dummyFileProcessorCircular") @DependsOn({"dummyFileReaderCircular"}) @Lazy public FileProcessor dummyFileProcessorCircular() { return new FileProcessor(file); }

Pergantungan bulat dapat terjadi jika kacang memiliki kebergantungan akhirnya pada dirinya sendiri , mewujudkan lingkaran:

Bean1 -> Bean4 -> Bean6 -> Bean1

6. Perkara Utama

Akhirnya, ada beberapa perkara yang harus kita jaga semasa menggunakan anotasi @DependsOn :

  • Semasa menggunakan @DependsOn, kita mesti menggunakan pengimbasan komponen
  • Sekiranya kelas DependsOn tanpa tanda dinyatakan melalui XML, metadata anotasi DependsOn akan diabaikan

7. Kesimpulannya

@DependsOn menjadi sangat berguna ketika membina sistem dengan keperluan pergantungan yang kompleks.

Ini memudahkan Suntikan Ketergantungan, memastikan bahawa Spring akan menangani semua inisialisasi Kacang yang diperlukan sebelum memuat kelas bergantung kami.

Seperti biasa, kodnya boleh didapati di GitHub.